我正在尝试在没有外键的情况下在数据库中创建实体,并在稍后阶段更新外键。
@Entity
public class Business {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int businessId;
@Column
private String businessName;
@ManyToOne()
@JoinColumn(name="billTypeId", nullable=true)
@NotFound(action=NotFoundAction.IGNORE)
private BillType billType;
// getters and setters
}
billType属性的值为null,我收到以下异常:
Caused by: java.sql.SQLIntegrityConstraintViolationException: (conn:54)
Column 'billTypeId' cannot be null
at org.mariadb.jdbc.internal.util.exceptions.ExceptionMapper.get(ExceptionMapper.java:152)
at org.mariadb.jdbc.internal.util.exceptions.ExceptionMapper.getException(ExceptionMapper.java:118)
当billType成员为null时,如何持久保存业务对象并在billTypeId字段中具有零值
答案 0 :(得分:1)
通常我建议重新考虑这种方法,并在数据库中的billTypeId
列上允许空值,因为这是标准行为。此类0
值也将被视为您未来可能指定的任何外键约束的引用ID
。
如果你想尝试不同的方法
一种选择是将刷新模式从AUTO
(默认)更改为COMMIT
或MANUAL
,并在实际将任何内容刷新到数据库之前构建完整的实体树。 (AUTO
检查每个SELECT
之前的会话更改,并将更改刷新到数据库(如果有)。这可以确保您正在读取最新数据,但也会导致性能下降。)
另外Hibernate提供
@DynamicInsert
注释,它将建议Hibernate仅为非空列值生成INSERT
语句(doc)@DynamicUpdate
注释将建议Hibernate仅针对值已更改的列生成UPDATE
语句(doc)我建议谨慎使用这种方法。
或者,您可以指定insertable
注释的updatable
和@JoinColumn
属性(doc)。如果你使用的情况是插入没有链接的记录并在以后的修改中更新它,那么insertable=false
应该适合你。