【发布时间】:2013-11-29 04:07:30
【问题描述】:
我正在使用 Hibernate 5 和 Spring 3.2.4。我正在设计一个用户实体,我想在其中包含对创建实体的用户的引用 - 所以是一个自我引用。自引用本身并没有太大问题,但我想将该字段指定为非空。这可能吗?如果该字段不为空,因为引用的实体尚不存在,如何在数据库中创建第一个条目?
例如:
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private Long User.id;
@NotNull
private String username;
private String password;
@NotNull
private User user;
// getters and setters omitted for brevity
}
如果我尝试:
User u = new User();
u.setUsername("username");
u.setCreatedBy(u);
并尝试坚持u,我收到以下错误消息:
Caused by: org.hibernate.TransientPropertyValueException: Not-null property references a transient value - transient instance must be saved before current operation: com.domain.User.createdBy -> com.domain.User
我了解 Hibernate 抱怨它不能引用瞬态实例(即:u),但我不能持久化 u,除非我有一个可以引用的非空用户。但是在一个空的数据库中,没有这样的条目。
这种配置是不可能的吗?或者有没有办法解决这个问题?
【问题讨论】:
-
您是否尝试过使用 @ManyToOne 指定映射?我也没有看到标识符字段,你有没有像 setter 一样省略它?
-
@elusive-code - 我更新了没有
@Roo注释的实体以显示附加文件。是的 - 为了简洁起见,我省略了 getter/setter。 @ManyToOne 和@NotNull 之间的区别,据我了解,@ManyToOne 将用于 DDL 生成和持久化 bean 时,但是即使不持久化 bean,@NotNull 也可用于 bean 验证。跨度>
标签: java hibernate jpa persistence hibernate-5.x