gpt4 book ai didi

jpa-2.0 - 无法使@ManyToOne关系为空

转载 作者:行者123 更新时间:2023-12-03 14:07:53 27 4
gpt4 key购买 nike

我有一个多对一的关系,我想可以为空:

@ManyToOne(optional = true)
@JoinColumn(name = "customer_id", nullable = true)
private Customer customer;

不幸的是,JPA一直将数据库中的列设置为NOT NULL。谁能解释一下?有办法使它起作用吗?请注意,我将JBoss 7,JPA 2.0和Hibernate用作持久性提供程序和PostgreSQL 9.1数据库。

编辑:

我找到了问题的原因。显然,这是由于我在引用的实体 Customer中定义主键的方式所致:
@Entity
@Table
public class Customer {
@Id
@GeneratedValue
@Column(columnDefinition="serial")
private int id;
}

似乎使用 @Column(columnDefinition="serial")作为主键会自动将引用它的外键设置为数据库中的 NOT NULL。将列类型指定为 serial时,这确实是预期的行为吗?在这种情况下是否有启用空的外键的解决方法?

先感谢您。

最佳答案

我找到了解决问题的方法。在实体Customer中定义主键的方式很好,问题出在外键声明中。应该这样声明:

@ManyToOne
@JoinColumn(columnDefinition="integer", name="customer_id")
private Customer customer;

实际上,如果省略了 columnDefinition="integer"属性,则默认情况下会将外键设置为源列:具有其自身序列的非空序列。当然这不是我们想要的,因为我们只想引用自动递增的ID,而不是创建一个新的ID。

此外,似乎在执行某些测试时也需要 name=customer_id属性。否则,外键列仍将设置为源列。我认为这是一种奇怪的行为。欢迎发表评论或其他信息以澄清这一点!

最后,此解决方案的优势在于ID是由数据库(而不是JPA)生成的,因此,当手动插入数据或通过脚本在数据迁移或维护中经常插入数据时,我们不必担心它。

关于jpa-2.0 - 无法使@ManyToOne关系为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15511899/

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