gpt4 book ai didi

java - Hibernate -> LazyInitializationException 与 n :m relation

转载 作者:行者123 更新时间:2023-11-30 05:09:35 24 4
gpt4 key购买 nike

我遇到了 Hibernate 和 LazyInitializationException 问题。我搜索并找到了很多答案,但我不能用它们来解决我的问题,因为我不得不说,我是 Hibernate 的新手。

我运行 JUnit 测试,以防出现以下错误:

@Test
public void testAddPerson() {
Set<Person> persons = service.getAllPersons();

// create new person
Person person = new Person();
person.setEmail("john@doe.com");
Project testProject = serviceProj.findProjectById(1);

HashSet<Project> lister = new HashSet<Project>();
lister.add(testProject);
person.setProjects(lister);
service.addPerson(person);

testProject.getPersons().add(person);
...
}

最后显示的行:

testProject.getPersons().add(person);

抛出此错误:

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.doe.john.domain.Project.persons, no session or session was closed

人员和项目是双向的 n:m:

Person.java:

@ManyToMany(mappedBy="persons")
private Set<Project> projects = new HashSet<Project>();

Project.java:

@ManyToMany
@JoinTable(name = "Project_Person",
joinColumns = {@JoinColumn(name="project_id", referencedColumnName="id")},
inverseJoinColumns = {@JoinColumn(name="person_id", referencedColumnName="id")}
)
private Set<Person> persons = new HashSet<Person>();

那么问题出在哪里呢?

最佳答案

问题是默认情况下集合是延迟加载的。这意味着在访问它之前,它实际上不会从数据库加载。为了加载它,您将需要一个 Activity 的 session /事务。

最简单的方法是将其更改为 FethType.EAGER,以确保立即填充集合。

--更新--

我最近遇到了同样的问题,我最终修改了我的实际服务来处理这类事情。在 ProjectService 类中声明 addPerson 方法。

public void addPersonTo(Project project, Person person)
{
project = em.merge(project); //EntityManager, not sure what you are using but you get the idea hopefully
project.addPerson(person);
}

关于java - Hibernate -> LazyInitializationException 与 n :m relation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3914700/

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