如何让Hibernate在合并时忽略@OneToMany?

时间:2012-10-10 02:49:08

标签: hibernate ejb-3.0

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;
   ...
}

如何让hibernate在应用程序对象中只读取许可证,而不是在我去em.merge(应用程序)时尝试保留许可证;

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

合并后我一直在

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

2 个答案:

答案 0 :(得分:4)

使用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;

答案 1 :(得分:0)

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

  1. 取消应用程序上的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
    
  3. 通过上述内容,您无需任何许可即可保存应用程序。但是如果没有应用程序,则无法保存许可证。经过测试,有效..

    -Maddy

相关问题