我在 Play 上使用 Hibernate 4.1.3 (JPA)!框架。数据库是 PostgreSQL 8.4.2。架构是使用生成的hibernate.hbm2ddl.auto="update"
。
简短版本:我有一个类,它的@Id
字段是@GeneratedValue
. 有时,当persist
我使用它时,我得到一个空列违规,为什么?
更多细节:
我有一个非常简单的类,我想将其保存到数据库中,如下所示:
@Entity
class MyObject {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public Long id;
@NotNull
public String email;
public Integer total;
}
我通常创建一个 MyObject 的实例,在为 null时为email
和total
字段分配一个值,然后通过. Hibernate 获取新对象的 id 并将其保存到数据库。id
EntityManager.persist()
但是有时,我会得到以下堆栈跟踪:
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);