我有一个父对象,可以说是 Campaign 和子对象 Ad Segments。Campaign 与 Ad Segments 保持一对多的关系。以下是我定义的注释。
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;
阅读以下内容:休眠: CascadeType.PERSIST 不起作用,但 CascadeType.ALL 保存对象 我的问题是,如果在更新父对象时,子表中不应该发生任何事情,我应该使用哪个注释?使用 SAVE_UPDATE 更安全吗?
请帮忙!