jpa-2.0 – 不能使@ManyToOne关系为空

前端之家收集整理的这篇文章主要介绍了jpa-2.0 – 不能使@ManyToOne关系为空前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一对一的关系,我想要空:
@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.当将列类型指定为串行时,这是否真的是预期的行为?在这种情况下是否有使可空的外键的解决方法

先谢谢你.

解决方法

我找到了解决我的问题.主键在实体Customer中定义的方式很好,问题在于外键声明.应该这样宣布:
@ManyToOne
@JoinColumn(columnDefinition="integer",name="customer_id")
private Customer customer;

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

此外,在执行一些测试时,我看来还需要属性name = customer_id.否则外键列仍将设置为源列.这在我看来是一个奇怪的行为.欢迎评论或补充资料澄清此事!

最后,该解决方案的优点是ID由数据库生成(而不是由JPA生成),因此在手动或经常在数据迁移或维护中发生的脚本插入数据时,我们无需担心.

猜你在找的Java相关文章