gpt4 book ai didi

java - 没有惰性字段的 Hibernate 克隆实体

转载 作者:太空宇宙 更新时间:2023-11-04 09:35:52 25 4
gpt4 key购买 nike

我有两个实体:

@Entity
@Table(name = "users")
public class User {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Column(name = "name")
private String name;

@Column(name = "age")
private int age;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "person_id")
private Person person;

@Entity
@Table(name = "persons")
public class Person {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Column(name = "name")
private String name;

@Column(name = "number")
private String number;

这个人很懒。我加载一个用户并将其分离。

    @Transactional
@Override
public void run(String... args) {
User user = userService.getOne(1L);

userService.detach(user);

System.out.println(user.getName());
System.out.println(user.getAge());
Person person = user.getPerson();
System.out.println(person.getName());
System.out.println(person.getNumber());
}

但是当我调用user.getPerson()时 - 它不会抛出异常。我预计会出现异常,因为我分离了实体并尝试调用 LAZY 字段,但它仍然有效。

我想创建用户的克隆(没有人)并另存为新实体。

User user = userService.getOne(1L);
userService.detach(user);
user.setId(null)//autogenerate id

但是当我保存用户时,人也会克隆。我可以设置空:

User user = userService.getOne(1L);
userService.detach(user);
user.setId(null);
user.setPerson(null);

但是人很懒,看起来就像是黑客。那么 detach 方法有什么意义......

编辑:

非常有趣的事情 - 如果我在使用断点进行调试时启动示例应用程序 - 一切正常,但如果我取消选择所有断点,我会在控制台中收到异常:

Caused by: org.hibernate.LazyInitializationException: could not initialize proxy [com.example.detachexample.User#1] - no Session

最佳答案

如果我理解的话,你是在克隆上调用分离?那么,该克隆不是普通的 User 对象,而是扩展 User 对象的代理。

您需要首先使用unproxy获取原始加载的实体。

User olduser = userService.getOne(1L);
User user = org.hibernate.Hibernate.unproxy(olduser);
if (olduser == user) userService.detach(user);
user.setId(null)//autogenerate id
user.getPerson().setId(null); // so you will generate this as well
user.getPerson().setUser(user); // so that it will point to the correct new entity

关于java - 没有惰性字段的 Hibernate 克隆实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56527879/

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