我有一个父对象让我们说广告系列和子对象广告细分。广告系列与广告细分受众群保持一对多关系。以下是我定义的注释。
class CampaignModel {
OneToMany(mappedBy="campaign", cascade=CascadeType.PERSIST, fetch = FetchType.EAGER)
@Setter
@Column(updatable=false)
private List<AdSegmentModel> segments;
.....
}
class AdSegmentModel {
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="campaign_id")
@Getter
@Setter
private CampaignModel campaign;
要求:
当我们插入广告系列模型时,广告细分也应该插入。
当我们检索广告系列模型时,应检索到相应的广告细分。
广告细分不可更新。我们更新广告系列时,广告细分表中不会发生任何事情。
面临的问题:
当我执行CascadeType.PERSIST时,系统会插入广告系列但广告细分表中没有任何内容。 (原因:https://www.mkyong.com/hibernate/cascade-jpa-hibernate-annotation-common-mistake/)。我不知道解决方案,因为我不想给CascadeType.SAVE_UPDATE。因为在更新广告系列的情况下会导致不必要的操作。
当我检索广告系列时,它会给我重复记录。原因是它正在使用广告细分表格进行左外连接,并且由于广告细分表格在广告系列表格中有一行与一行相对应,因此它是重复记录。
用于保存Campiagn对象:
try {
Session session = sessionFactory
.getCurrentSession();
long id = (long) session.save(newCampaign);
return id;
} catch (HibernateException e) {
throw new DependencyException("Cannot save campaign", e);
}
获取广告系列:
Session session = sessionFactory
.getCurrentSession();
List<Criterion> criteria = new ArrayList<>();
criteria.add(Restrictions.eq("obfuscatedEntityId",
obfuscatedEntityId));
List<CampaignModel> campaignModels = HibernateUtils
.loadObjectsFromHibernate(session, criteria, CampaignModel.class);
System.out.println("size inside builder functionsss"+campaignModels.size());
return campaignModels;
阅读本文:Hibernate : CascadeType.PERSIST does not work but CascadeType.ALL to save object 我的问题是,如果在更新父对象时,在子表中什么都不应该发生我应该使用哪个注释?使用SAVE_UPDATE更安全吗?
请帮忙!