【发布时间】:2015-11-10 00:20:48
【问题描述】:
我有一张桌子
CREATE TABLE "PEOPLE" (
"NAME" VARCHAR2(40 CHAR) NOT NULL,
"SURNAME" VARCHAR2(40 CHAR) NOT NULL,
"FATHER_NAME" VARCHAR2(40 CHAR),
"IS_RETIRED" CHAR(1 CHAR) DEFAULT 'N' NOT NULL
);
我已经注释了:
@Entity
@Table(name = "PEOPLE")
@DynamicInsert
@DynamicUpdate
public class Person {
public enum YesNo {
Y, N;
}
public Person(String name, String surname) {
this.name = name;
this.surname = surname;
}
@Column(name = "NAME", nullable = false, length = 40)
private String name;
@Column(name = "SURNAME", nullable = false, length = 40)
private String surname;
@Column(name = "FATHER_NAME", length = 40)
private String fatherName;
@Enumerated(EnumType.STRING)
@Column(name = "IS_RETIRED", nullable = false)
private YesNo isRetired;
... // simple getter and setter for each field
}
我要运行代码:
...
Peson person = new Person ("John", "Smith");
entityManager.persist(person);
... // diffrent operations, end of old transaction, begin of new
person.setFatherName("Peter");
entityManager.update(person);
我收到错误:
java.sql.SQLException: ORA-01407: cannot update (???) to NULL
似乎尽管在 DB 中给出了默认值,但在对象 person 的字段 isRetired 的持久值之后仍然为空。当我尝试对人执行动态更新时,hibernate 想要将 DB ('N') 中保存的值更改为 null。有没有办法在动态插入后使用默认值自动更新字段的值?是否可以在不硬编码 Java 中的类定义中的默认值的情况下执行它(如果我更改数据库中的默认值,我不想在 Java 代码中做同样的事情)?
【问题讨论】:
-
只需删除 nullable = false
-
没用。字段“isRetired”的值仍然为 null,hibernate 尝试将 DB 中列的值设置为 null,这会导致引发异常。
-
如果我理解正确,在持久化
person对象后,数据库中IS_RETIRED列的值设置为'N',但在内存中isRetired属性的值对象的仍然是 NULL。在我看来,您应该从数据库中重新获取person对象的值,以便两者同步,或者在调用persist之前将isRetired设置为“N”(否)。基本上,您指望数据库中的“隐藏”行为在内存中设置数据库一无所知的属性,显然 Hibernate 并没有自动执行此操作。祝你好运。
标签: java oracle hibernate jpa annotations