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
答案 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)
从许可证到应用程序的单向关系。你需要改变的事情
在许可方,
@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
通过上述内容,您无需任何许可即可保存应用程序。但是如果没有应用程序,则无法保存许可证。经过测试,有效..
-Maddy