加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-14 05:11:26 所属栏目:Java 来源:网络整理
导读:我有一对一的关系,我想要空: @ManyToOne(optional = true)@JoinColumn(name = "customer_id",nullable = true)private Customer customer; 不幸的是,JPA将数据库中的列设置为NOT NULL.有人可以解释一下吗有办法让它工作吗?请注意,我使用JBoss 7,JPA 2.0与H
我有一对一的关系,我想要空:
@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生成),因此在手动或经常在数据迁移或维护中发生的脚本插入数据时,我们无需担心.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读