【问题标题】:Hibernate JoinColumn Error on not null constraint非空约束上的休眠 JoinColumn 错误
【发布时间】:2015-03-13 08:25:27
【问题描述】:

这是我的课程列表

@MappedSuperclass
public abstract class JpaModel {

    @Id
    @Column(name ="ID", columnDefinition = "serial")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
}

产品实体

@Entity
@Table(name = "REF_PRODUCT")
public class Product extends JpaModel{

    @Column(name= "NAME")
    private String name;

    @Column(name = "MANUFACTURER")
    private String manufacturer;

    /**
     * Work around for missing
     */
    @OneToOne(optional = true)
    @JoinColumn(name="id")
    private InventoryItemPicture picture;

.... }

和库存物品图片实体

@Entity
@Table(name = "TXN_INVENTORY_PICTURE")
public class InventoryItemPicture extends JpaModel{

    @Column
    private byte[] image;

    @Column
    private String fileName;

保存产品时,inventoryItemPicture 是可选的,因此有时它会为空值,这是我希望发生的事情。但是,在使用空值保存产品实体时,会出现此错误。

Caused by: org.postgresql.util.PSQLException: ERROR: null value in column "id" violates not-null constraint
  Detail: Failing row contains (null, null, test, dsadas, sdas, dsadsa, 500.00, 1000.00, 1500.00, 5, PRODUCT).
    at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2198)
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1927)
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:255)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:561)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:419)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.java:365)
    at com.zaxxer.hikari.proxy.PreparedStatementProxy.executeUpdate(PreparedStatementProxy.java:61)
    at com.zaxxer.hikari.proxy.PreparedStatementJavassistProxy.executeUpdate(PreparedStatementJavassistProxy.java)
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:208)
    ... 120 more

【问题讨论】:

  • 你的id栏在哪里,请加到代码中

标签: java entity-framework hibernate


【解决方案1】:

从您的日志中,它显示id=null,这与inventoryItemPicture 完全无关。

问题在@GeneratedValue(strategy = GenerationType.IDENTITY)

您的日志显示您正在使用 postgresql,但“IDENTITY”只能用于这些数据库:

  • Sybase、My SQL、MS SQL Server、DB2 和 HypersonicSQL。

你应该使用GenerationType.SEQUENCE,它支持:

  • Oracle、DB2、SAP DB、Postgre SQL 或 McKoi。

尝试将您的代码更改为:

@GeneratedValue(strategy = GenerationType.SEQUENCE)

【讨论】:

  • 您的日志中有两个空值,请检查您是否设置了另一个值。另外,您的查询是“executeUpdate”,如果它是新对象,您应该使用 save() 或 persist()。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-20
  • 2012-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-07
相关资源
最近更新 更多