【问题标题】:How to get Hibernate to ignore @OneToMany on merge?如何让 Hibernate 在合并时忽略 @OneToMany?
【发布时间】:2012-10-10 02:49:08
【问题描述】:
public class Application{
   @Id
   private Long id;

   @OneToMany(mappedBy = "application")
   private List<Licence> licences = new ArrayList<Licence>();
   ...
}

public class Licence{
   @Id
   private Long id;

   @ManyToOne(fetch = FetchType.LAZY)
   @JoinColumn(name = "ID", nullable = false)
   private Application application;
   ...
}

当我进入 em.merge(application); 时,如何让休眠状态以只读方式将许可证留在应用程序对象中,而不是尝试保留许可证;

我没有尝试在应用程序中使用 Cascade 保存许可证。许可证在实际持久化之前需要运行很多业务规则,因此我将分别在每个许可证上调用persist。我该怎么做呢 ?这适用于持久化但不适用于合并。

在合并时我不断得到

org.hibernate.TransientObjectException: object is an unsaved transient 
     instance - save the transient instance before merging: com.cmr.Licence

【问题讨论】:

    标签: hibernate ejb-3.0


    【解决方案1】:

    使用insertable = false, updatable = false。更新这个

      @ManyToOne(fetch = FetchType.LAZY)
      @JoinColumn(name = "ID", nullable = false)
      private Application application;
    

      @ManyToOne(fetch = FetchType.LAZY)
      @JoinColumn(name = "ID", nullable = false, insertable = false, updatable = false)
      private Application application;
    

    【讨论】:

    • 我认为这会使应用程序无法保存在许可证上?例如:如果我去 em.persist(licence) 我应该能够保存应用程序和许可证。但是如果我去 em.persist(application) 我不想保存许可证。将可插入和可更新为 false 到许可证中的应用程序将忽略我不想在许可证上保存的应用程序。
    【解决方案2】:

    从许可证到应用程序的单向关系。你需要改变的事情

    1. 在 Application 中取出 OneToMany 关系
    2. 在许可方面,

       @Column(nullable = false, insertable = false, updatable = false)
       private Long application_id;
      
       @ManyToOne(optional = false)
       @JoinColumn(name = "application_id")
       private Application application;
      
       Test:
       em.persist(application) -- should be ok. 
       em.persist(licence) - not null voilation
      
       licence.setApplication(application)
       em.persist(licence) - should be ok
      

    通过以上内容,您可以在没有任何许可证的情况下保存应用程序。但是如果没有应用程序,您将无法保存许可证。经测试,有效..

    -麦迪

    【讨论】:

      猜你喜欢
      • 2012-12-31
      • 1970-01-01
      • 2020-01-11
      • 2012-09-03
      • 2011-08-04
      • 2013-04-30
      • 2015-12-01
      • 2020-11-19
      • 2014-11-12
      相关资源
      最近更新 更多