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

问题描述 投票:1回答:1

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

@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属性具有空值,我收到以下异常:

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

java hibernate
1个回答
1
投票

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

如果你想尝试不同的方法仍然

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

另外Hibernate提供

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

我建议小心使用这种方法。

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

© www.soinside.com 2019 - 2024. All rights reserved.