hibernate:在没有外键的情况下保存实体时的异常

时间:2017-12-20 15:26:11

标签: java hibernate

我正在尝试在没有外键的情况下在数据库中创建实体,并在稍后阶段更新外键。

@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字段中具有零值

1 个答案:

答案 0 :(得分:1)

通常我建议重新考虑这种方法,并在数据库中的billTypeId列上允许空值,因为这是标准行为。此类0值也将被视为您未来可能指定的任何外键约束的引用ID

如果你想尝试不同的方法

一种选择是将刷新模式从AUTO(默认)更改为COMMITMANUAL,并在实际将任何内容刷新到数据库之前构建完整的实体树。 (AUTO检查每个SELECT之前的会话更改,并将更改刷新到数据库(如果有)。这可以确保您正在读取最新数据,但也会导致性能下降。)

另外Hibernate提供

  • @DynamicInsert注释,它将建议Hibernate仅为非空列值生成INSERT语句(doc
  • @DynamicUpdate注释将建议Hibernate仅针对值已更改的列生成UPDATE语句(doc

我建议谨慎使用这种方法。

或者,您可以指定insertable注释的updatable@JoinColumn属性(doc)。如果你使用的情况是插入没有链接的记录并在以后的修改中更新它,那么insertable=false应该适合你。