Java Hibernate抛出;“不允许为空”列;因为在使用@MapsId时,SQL插入中缺少JPA OneToOne关系FK
关于我的一对一关系,我得到: “用户ID”列不允许为空;SQL语句: 在客户订单(id、已启用、或已启用id)中插入值(null、、?) 它实际上是Java Hibernate抛出;“不允许为空”列;因为在使用@MapsId时,SQL插入中缺少JPA OneToOne关系FK,java,hibernate,jpa,hibernate-mapping,one-to-one,Java,Hibernate,Jpa,Hibernate Mapping,One To One,关于我的一对一关系,我得到: “用户ID”列不允许为空;SQL语句: 在客户订单(id、已启用、或已启用id)中插入值(null、、?) 它实际上是null,因为在INSERT查询中不存在。但是,当执行save(customerOrder)时,值USER将填入customerOrder实体 @Getter @超级建筑商 @映射超类 @诺尔格构装师 @EqualsAndHashCode(仅限于xplicitlyincluded=true) 公共抽象类AbstractEntity{ @身份证 @Eq
null
,因为在INSERT
查询中不存在。但是,当执行save(customerOrder)
时,值USER
将填入customerOrder
实体
@Getter
@超级建筑商
@映射超类
@诺尔格构装师
@EqualsAndHashCode(仅限于xplicitlyincluded=true)
公共抽象类AbstractEntity{
@身份证
@EqualsAndHashCode.Include
@GeneratedValue(策略=GenerationType.IDENTITY)
私人长id;
@塞特
@违约
@列(columnDefinition=“布尔默认值‘true’”,null=false)
启用专用布尔值=Boolean.TRUE;
}
@吸气剂
@塞特
@实体
@表(name=“客户订单”)
@超级建筑商
@诺尔格构装师
@EqualsAndHashCode(callSuper=true,onlyExplicitlyIncluded=true)
公共类CustomerOrderEntity扩展了AbstractEntity{
@OneToOne(fetch=FetchType.LAZY)
@MapsId(“id”)
私有用户实体用户;
//其他价值观
}
@资料
@实体
@表(name=“user”)
@超级建筑商
@诺尔格构装师
@EqualsAndHashCode(callSuper=true,onlyExplicitlyIncluded=true)
公共类UserEntity扩展了AbstractEntity{
@归化
@EqualsAndHashCode.Include
@列(长度=28,唯一性=true,可空性=false)
私有字符串uuid;
//其他价值观
}
我希望
customerOrder
能够用填充的数据保存在数据库中。您的代码完全按照您指定的方式工作
如果您有一个共享键(使用@MapsId),Hibernate将不会为外键使用单独的列。这就是为什么insert查询不包含user\u id
列的原因
如果是这样,CustomerOrderEntity中的id一方面是自动生成的(如超类中定义的),另一方面映射另一个实体的id。这些要求相互冲突。使用允许将子表主键用作父表主键的外键
如果启用hbm2ddl
工具,您将看到customer\u order
表将不包含user\u id
列
但是,由于您之前生成了数据库架构,并且您有一个带有专用用户id
列的客户订单
表,因此您需要删除@MapsId
:
@OneToOne(fetch = FetchType.LAZY)
private UserEntity user;
这样,user
关联将使用user\u id
外键列。删除@MapsId(“id”)
注释解决了问题!