【发布时间】:2011-07-27 13:06:57
【问题描述】:
如何添加递归非空关系的第一个实体?
尝试对用户实体使用我的默认审计守卫 (EntityListener) 时会出现问题。 Hibernate 无法插入第一个用户。例子是情况的简化:
@Entity
class User {
@Id @GeneratedValue
private Long id;
@Basic
private String name;
@ManyToOne(optional=false)
@JoinColumn(nullable=false,updatable=false)
private User createdBy;
// getters & setters
// equals & hashcode are based on name
}
我尝试过类似的方法:
User user = new User();
user.setName( "Some one" );
user.setCreatedBy( user );
休眠失败,根异常是:
com.microsoft.sqlserver.jdbc.SQLServerException: Cannot insert the value NULL into
column 'createdby_id', table 'mydb.user'; column does not allow nulls. INSERT fails.
我知道几种解决方法:手动插入第一个实体(SQL 插入)或设置 nullable=true。首先很烦人,其次是完整性故障点(需要自定义审计侦听器和数据库触发器)。有更好的选择吗?或者,换句话说:是否有仅限 JPA 的解决方案?
我的平台是:SQL Server 2008 和 Hibernate 3.6 作为 JPA2 提供程序。
编辑:起初,我使用的是persist()。我尝试了merge(),这可以做出更明智的猜测,但没有区别。我也试过CascadeType.MERGE。
【问题讨论】:
标签: hibernate jpa recursion jpa-2.0