休眠自引用实体作为非空列

Eri*_* B. 5 java persistence hibernate jpa hibernate-5.x

我正在使用 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
}
Run Code Online (Sandbox Code Playgroud)

如果我尝试:

User u = new User();
u.setUsername("username");
u.setCreatedBy(u);
Run Code Online (Sandbox Code Playgroud)

并尝试坚持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
Run Code Online (Sandbox Code Playgroud)

我知道 Hibernate 抱怨它无法引用瞬态实例(即:)u,但u除非我有一个可以引用的非空用户,否则我无法坚持。但是在一个空的数据库中,没有这样的条目。

这种配置是不可能做到的吗?或者有没有办法解决这个问题?

Ale*_*eev 4

我不明白这个 Roo 注释,并且我不使用 Hibernate 特定的注释,只使用 JPA。我对自我参考没有任何问题。但我有一些提示给你:

  1. 正如前面提到的,使用@ManyToOne注释。
  2. AFAIK,@NotNull注释(或nullable中的字段@Column)不影响映射,只影响 DDL 生成。我不使用域模型生成 DDL,我从来没有指定过这一点吗?相反,我optional使用@ManyToOne.
  3. 您使用什么标识符生成策略?如果是自动增量,则在约束下不可能进行自引用NOT NULL。因此,要么使用基于序列的标识符生成器,​​要么删除约束。我会先用。
  4. 正如我提到的,当您有约束时,将optional字段设置为@ManyToOneto 。否则,Hibernate 会尝试进行两个查询:插入并设置为,然后更新。并且第一个查询在启用约束的情况下失败。falseNOT NULLcreatedBy_idNULLcreatedBy_idNOT NULL