给休眠关联注释的困惑

IT小君   2022-09-15T08:19:16

我有一个父对象,可以说是 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;

要求 :

  1. 当我们插入广告系列模型时,广告片段也应该被插入。

  2. 当我们检索活动模型时,应该检索相应的广告片段。

  3. 广告段是不可更新的。当我们更新广告系列时,广告细分表中不会发生任何事情。

面临的问题:

  1. 当我执行 CascadeType.PERSIST 时,正在插入广告系列,但广告细分表中没有任何反应。(原因:https ://www.mkyong.com/hibernate/cascade-jpa-hibernate-annotation-common-mistake/ )。我不知道解决方案,因为我不想提供 CascadeType.SAVE_UPDATE。因为在更新活动的情况下会导致不必要的操作。

  2. 当我检索活动时,它给了我重复的记录。原因是它正在与广告段表进行左外连接,并且由于广告段表有多行对应于活动表中的一行,因此它给出了重复记录。

用于保存 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 更安全吗?

请帮忙!

点击广告,支持我们为你提供更好的服务
评论(0)