gpt4 book ai didi

hibernate - 如果存在类似的行,如何避免创建新行?

转载 作者:行者123 更新时间:2023-12-04 00:58:40 25 4
gpt4 key购买 nike

我需要配置 hibernate 以避免创建重复的行,(尽管该行存在,但它会创建一个新行,并且由于只设置了一个字段,因此将其余所有行设置为 NULL)

可以说我有一排如下

id des    index age
1 MyName 2 23

虽然我只是将 MyName 设置为 des 并且它已经存在于 Name 表 hibernate
创建一个新行如下
id des    index age
1 MyName 2 23
2 MyName Null Null << new row with null values will be created
rather than updating the previous one

当我想
.
所以我在我的类中添加了以下注释,但它跨越了实体和动态更新。
@org.hibernate.annotations.Entity(
dynamicUpdate = true
)

我用了 @DynamicUpdate同样,虽然 hibernate 接受它,但我仍然有同样的问题。

有没有其他方法可以做到这一点?我的 hibernate 版本如下
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.2.1.Final</version>
<type>jar</type>
</dependency>

* 根据 Ray 的评论,通过为子类的 Id 分配一个值,它可以正常工作,但是如果我没有 ID 怎么办?我必须先进行选择才能找到 id 吗?有没有什么方法可以强制 hibernate 根据子类的值自动执行它而不是单独选择来查找id? *

用户.Java
....
import org.hibernate.annotations.DynamicUpdate;

@Entity
@Table(name = "user")
@DynamicUpdate
public class User implements Serializable {

private int ID;
private Name name;
private String type;

public User() {
}

@Id
@GeneratedValue
@Column(name = "id")
public int getID() {
return ID;
}

public void setID(int ID) {
this.ID = ID;
}

@ManyToOne(cascade = CascadeType.ALL)
public Name getName() {
return name;
}

public void setName(Name name) {
this.name = name;
}

.....

名称.Java
@Entity()
@Table(name = "Name")
public class Name implements Serializable {

private int id;
private String des;
private String index;
private String age;

public Name() {
}

@Id
@GeneratedValue
@Column(name="id", unique= true, nullable = false)
public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

.....

模型.java
public void addMyUsers(){
Name name = new Name();
name.setDes("MyName");
While( ..... )
{
User user = new User();
user.setName(name);
user.setType(X);
addUser(user);
}
}

public void addUser(User user) {
session = Util.getSession();

session.beginTransaction();


session.merge(user);
//session.saveOrUpdate(user);

session.getTransaction().commit();

session.close();
}

最佳答案

although the row exists it creates a new one



这不太对。不仅仅是hibernate自动决定创建一个新用户。 Hibernate 正在做你的代码告诉它的事情:
  • addMyUsers() , 你创建 new Name()new User() ,并且您都没有给这些中的任何一个提供预先存在的 ID。您已使这些对象看起来像新对象,而不是要更新的预先存在的对象。
  • addMyUser() ,您调用session.merge(user) . Hibernate 看到这些对象没有 ID - 所以它合并它们并为它们分配 NEW 状态。当事务被刷新和提交时,hibernate 生成 SQL 来创建新的 ID 并将对象存储为新记录。

  • 如果要确定一个对象是否预先存在,并在可能的情况下对先前的记录进行操作:
  • 获取您要使用的字段(例如,从 Web 表单中) - 在您的情况下,这包括“det”字段。
  • 查看该记录是否已存在于数据库中。通过 session.find() 使用 hibernate 检索对象或 session.get() ,在您的情况下使用“det”字段。
  • 如果找不到对象,则创建一个新对象。
  • 对于检索到的对象,您可以选择在修改之前将对象从 session 中分离出来(例如,通过 session.clear() )。新创建的对象已经处于分离状态。
  • 修改对象(设置它的字段)。
  • 如果对象已分离,则通过 session.merge() 附加.合并适用于预先存在的分离对象(通过检索获得)和新分离对象(通过 new <Object>() )。或者,对于预先存在的分离对象,您可以调用 session.update()对于新的分离对象,您可以调用 session.save()/persist() .
  • 刷新/提交事务。

  • 你失踪了(2)。

    关于hibernate - 如果存在类似的行,如何避免创建新行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17080864/

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