【发布时间】:2012-05-26 13:10:59
【问题描述】:
我在 Play 上使用 Hibernate 4.1.3 (JPA)!框架。数据库是 PostgreSQL 8.4.2。架构是使用hibernate.hbm2ddl.auto="update" 生成的。
简短版:我有一个类有一个@Id 字段,即@GeneratedValue。有时,当persisting 时,我得到一个空列违规,为什么?
更多细节:
我有一个非常简单的类,我想将其保存到数据库中,如下所示:
@Entity
class MyObject {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public Long id;
@NotNull
public String email;
public Integer total;
}
我通常创建一个 MyObject 的实例,我为 email 和 total 字段分配一个值,而 id 为空,我通过 EntityManager.persist() 保存它。 Hibernate 获取新对象的 id 并将其保存到 DB。
但有时,我会得到以下堆栈跟踪:
2012-05-19 00:45:16,335 - [ERROR] - from org.hibernate.engine.jdbc.spi.SqlExceptionHelper [SqlExceptionHelper.java:144] in play-akka.actor.actions-dispatcher-6
ERROR: null value in column "id" violates not-null constraint
2012-05-19 00:45:16,350 - [ERROR] - from application in play-akka.actor.actions-dispatcher-6
! @6ad7j3p8p - Internal server error, for request [POST /method] ->
play.core.ActionInvoker$$anonfun$receive$1$$anon$1: Execution exception [[PersistenceException: org.hibernate.exception.ConstraintViolationException: ERROR: null value in column "id" violates not-null constraint]]
这怎么可能?如何追踪问题?
以下是 Hibernate 生成的相关 DDL:
CREATE TABLE myobject (
id bigint NOT NULL,
email character varying(255) NOT NULL,
physical integer
);
CREATE SEQUENCE hibernate_sequence
START WITH 1
INCREMENT BY 1
NO MAXVALUE
NO MINVALUE
CACHE 1;
ALTER TABLE ONLY dailydetailedscore
ADD CONSTRAINT dailydetailedscore_pkey PRIMARY KEY (id);
【问题讨论】:
-
添加 Hibernate 为您的数据库生成的 DDL。 GenerationType.AUTO 表示您已选择让 Hibernate 为您选择生成类型,这可能不是您打算做的。
-
@Perception:完成,感谢您指出。
-
架构看起来不错。这可能是 Play 之间的交互问题!和 JPA。您是否尝试过使用标识列?
-
@Perception "
GenerationType.AUTO表示您已选择让 Hibernate 选择一种生成类型" 但它应该选择一个好的。引用 JPA 标准 [强调添加]:“持久性提供者应该为特定数据库选择 适当 策略。”违反 NOT NULL 约束的策略永远不会是“适当的”。这是否表明 Hibernate 存在缺陷? -
我在使用 Spring+Hibernate+Derby 时遇到了类似的问题。
标签: java hibernate postgresql annotations playframework