【问题标题】:Auto updating fields with default values in DB after persisting using dynamicInsert使用 dynamicInsert 持久化后自动更新数据库中默认值的字段
【发布时间】: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


【解决方案1】:

查看 @DynamicUpdate 的 javadocs 似乎他们的关键点是“如果不启用 select-before-update,则无法重新附加分离的实体。”

所以,我的猜测是它对插入工作正常,但对更新却没有,因为它是与先前事务分离的实体。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-26
    • 1970-01-01
    • 1970-01-01
    • 2019-07-04
    • 1970-01-01
    • 2010-11-30
    • 2015-07-27
    • 2014-05-04
    相关资源
    最近更新 更多