gpt4 book ai didi

java - 使用dynamicInsert持久化后自动更新数据库中的默认值字段

转载 作者:行者123 更新时间:2023-12-02 05:56:25 25 4
gpt4 key购买 nike

我有一张 table

  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

似乎尽管在数据库中给出了默认值,但在持久化对象 person 的 isRetired 字段值后仍然为 null。当我尝试对人员执行动态更新时,hibernate 想要将数据库('N')中保存的值更改为 null。有没有办法在动态插入后自动将字段值更新为默认值?是否可以在 Java 中的类定义中不硬编码默认值的情况下执行它(如果我更改数据库中的默认值,我不想在 Java 代码中执行相同的操作)?

最佳答案

查看@DynamicUpdate的javadoc,似乎它们的关键点是“对于重新附加分离的实体,如果不启用select-before-update,这是不可能的。”

所以,我的猜测是它对于插入工作得很好,但对于更新则不然,因为它是与先前事务分离的实体。

关于java - 使用dynamicInsert持久化后自动更新数据库中的默认值字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32049106/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com