我有一对一的关系,我想要空:
@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生成),因此在手动或经常在数据迁移或维护中发生的脚本插入数据时,我们无需担心.