gpt4 book ai didi

java - Hibernate 自引用实体作为非空列

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:50:07 26 4
gpt4 key购买 nike

我正在使用 Hibernate 5 和 Spring 3.2.4。我正在设计一个用户实体,我想在其中包含对创建该实体的用户的引用 - 所以是 self 引用。自引用本身问题不大,但我想将该字段指定为非空。这可能吗?如果该字段不为空,因为引用的实体尚不存在,我该如何在数据库中创建第一个条目?

例如:

@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 提示它不能引用 transient 实例(即:u),但我不能持久化 u 除非我有一个非空用户我可以引用。但是在空数据库中,没有这样的条目。

这样的配置是不是做不到?或者有解决办法吗?

最佳答案

我不理解这个 Roo 注释,我不使用特定于 Hibernate 的注释,只使用 JPA。我对 self 引用没有任何问题。但我有一些提示给你:

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

关于java - Hibernate 自引用实体作为非空列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20278222/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com