为什么在数据库中插入 JPA null
Why insert JPA null in Database
我有一个带有最后修改日期的 table。我想在我的程序中手动设置它。奇怪的是,JPA 正确读取对象并且存在日期,因此列错误实际上是不可能的。但是,当我现在创建一个新对象时,会出现一条错误消息,指出 JPA 无法将 NULL 写入 LastChange 日期字段。(在 EntityManager 的 persist() 之前,我检查了日期是否为 NULL 并且它存在)
我使用 WAS 9.0 和带有 JPA 2.1 的默认 Eclipselink
在我的测试中 class:
@Column(Name="LetztesAenderungsdatum",insertable=true,updateable=true)
private java.sql.Date letztesAenderungsdatum
table 架构
CREATE TABLE Test
(
Testfall_Id INT (7),
LetztesAenderungsdatum DATE NOT NULL,
Name VARCHAR (25) NOT NULL,
Verfahren_FK INT CONSTRAINT Verfahren_FK REFERENCES
Verfahren(VERFAHREN_ID),
CONSTRAINT testfall_Id PRIMARY KEY(Testfall_Id)
);
在 Stack 跟踪带有日期的 Sysout 之前:
[12.06.18 13:45:14:415 CEST] 0000009f SystemOut O Testfall letztes Aenderungsdatum:2018-06-12
堆栈跟踪:
[12.06.18 13:45:25:289 CEST] 0000009f eclipselink W [eclipselink] Ausnahme [EclipseLink-4002] (Eclipse Persistence Services - 2.6.3.WAS-v20170717-04d37b5): org.eclipse.persistence.exceptions.DatabaseException
Interne Ausnahme: java.sql.SQLIntegrityConstraintViolationException: ORA-01400: Einfügen von NULL in ("SCHEMA"."TESTFALL"."LETZTESAENDERUNGSDATUM") nicht möglich
Fehlercode: 1400
Aufruf: INSERT INTO SCHEMA.Testfall (Testfall_Id, Beschreibung, LetztesAenderungsdatum, Name, Verfahren_FK) VALUES (?, ?, ?, ?, ?)
bind => [5 parameters bound]
Abfrage: InsertObjectQuery(myPackage.beans.Testfall@bcd7e11c)
您没有在 调用 persist
之前设置日期 。您还可以在注释映射中包含 nullable = false
。
你可能想做的是这样的:
@PreUpdate
protected void onUpdate() {
letztesAenderungsdatum = new Date();
}
@PrePersist
protected void onPersist() {
letztesAenderungsdatum = new Date();
}
我有一个带有最后修改日期的 table。我想在我的程序中手动设置它。奇怪的是,JPA 正确读取对象并且存在日期,因此列错误实际上是不可能的。但是,当我现在创建一个新对象时,会出现一条错误消息,指出 JPA 无法将 NULL 写入 LastChange 日期字段。(在 EntityManager 的 persist() 之前,我检查了日期是否为 NULL 并且它存在) 我使用 WAS 9.0 和带有 JPA 2.1 的默认 Eclipselink
在我的测试中 class:
@Column(Name="LetztesAenderungsdatum",insertable=true,updateable=true)
private java.sql.Date letztesAenderungsdatum
table 架构
CREATE TABLE Test
(
Testfall_Id INT (7),
LetztesAenderungsdatum DATE NOT NULL,
Name VARCHAR (25) NOT NULL,
Verfahren_FK INT CONSTRAINT Verfahren_FK REFERENCES
Verfahren(VERFAHREN_ID),
CONSTRAINT testfall_Id PRIMARY KEY(Testfall_Id)
);
在 Stack 跟踪带有日期的 Sysout 之前: [12.06.18 13:45:14:415 CEST] 0000009f SystemOut O Testfall letztes Aenderungsdatum:2018-06-12
堆栈跟踪:
[12.06.18 13:45:25:289 CEST] 0000009f eclipselink W [eclipselink] Ausnahme [EclipseLink-4002] (Eclipse Persistence Services - 2.6.3.WAS-v20170717-04d37b5): org.eclipse.persistence.exceptions.DatabaseException
Interne Ausnahme: java.sql.SQLIntegrityConstraintViolationException: ORA-01400: Einfügen von NULL in ("SCHEMA"."TESTFALL"."LETZTESAENDERUNGSDATUM") nicht möglich
Fehlercode: 1400
Aufruf: INSERT INTO SCHEMA.Testfall (Testfall_Id, Beschreibung, LetztesAenderungsdatum, Name, Verfahren_FK) VALUES (?, ?, ?, ?, ?)
bind => [5 parameters bound]
Abfrage: InsertObjectQuery(myPackage.beans.Testfall@bcd7e11c)
您没有在 调用 persist
之前设置日期 。您还可以在注释映射中包含 nullable = false
。
你可能想做的是这样的:
@PreUpdate
protected void onUpdate() {
letztesAenderungsdatum = new Date();
}
@PrePersist
protected void onPersist() {
letztesAenderungsdatum = new Date();
}