给出hibernate关联注释的困惑

时间:2016-12-11 08:35:27

标签: java spring hibernate hibernate-mapping hibernate-annotations

我有一个父对象让我们说广告系列和子对象广告细分。广告系列与广告细分受众群保持一对多关系。以下是我定义的注释。

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. 广告细分不可更新。我们更新广告系列时,广告细分表中不会发生任何事情。

  4. 面临的问题:

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

    2. 当我检索广告系列时,它会给我重复记录。原因是它正在使用广告细分表格进行左外连接,并且由于广告细分表格在广告系列表格中有一行与一行相对应,因此它是重复记录。

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

      请帮忙!

0 个答案:

没有答案