Java Spring Hibernate FetchType LazyInitializationException,即使在不调用关联时也是如此
我刚刚开始学习懒惰和渴望。我理解其中的区别,但即使我设置为懒惰,它仍会以某种方式试图获取相关数据 关系:1人:多部手机 查看的研究尝试和教程: 我知道要获取相关数据,我需要在会话()中执行此操作,因此对于Dao中的特定示例,我需要这样的内容Java Spring Hibernate FetchType LazyInitializationException,即使在不调用关联时也是如此,java,hibernate,Java,Hibernate,我刚刚开始学习懒惰和渴望。我理解其中的区别,但即使我设置为懒惰,它仍会以某种方式试图获取相关数据 关系:1人:多部手机 查看的研究尝试和教程: 我知道要获取相关数据,我需要在会话()中执行此操作,因此对于Dao中的特定示例,我需要这样的内容 List<Person> persons = criteria.list(); for(Person person : persons){ Set sets = person.getPhones();
List<Person> persons = criteria.list();
for(Person person : persons){
Set sets = person.getPhones();
}
return persons;
个人类
@Entity
@Table(name="person")
@Component
public class Person {
@Id
@GeneratedValue
private int person_id;
private String name;
private String age;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "person")
private Set<Phone> phones;
// Getter and setters
// ToString method by field name not by method
@Entity
@Table(name="phone")
@Component
public class Phone {
@Id
@GeneratedValue
private int phone_id;
private String type;
private String phone;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="person_person_id")
private Person person;
// Getter and setters
PersonDao
@Repository
@Transactional
@Component("personDao")
public class PersonDao {
@Autowired
private SessionFactory sessionFactory;
public Session session(){
return sessionFactory.getCurrentSession();
}
public List<Person> getPersonList(){
Criteria criteria = session().createCriteria(Person.class);
List<Person> persons = criteria.list();
// for(Person person : persons){
//
// Set sets = person.getPhones();
//
// }
return persons;
}
public void saveOrUpdate(Person person){
session().saveOrUpdate(person);
}
从Person类中的toString方法中删除phones字段 当你打电话时:
System.out.println(persons);
您试图访问电话字段,因为println为列表中的每个人调用toString方法,所以您得到LazyInitializationException。从person类中的toString方法中删除电话字段 当你打电话时:
System.out.println(persons);
您试图访问phones字段,因为println为列表中的每个人调用toString方法,所以您会得到LazyInitializationException。您是否在person类中的toString方法中打印phones属性?当您需要指定必须如何提取关系时,Fetchmode非常有用。通过联接或选择FectMode。请参阅文档:根据您的数据库模型,选择其中一个可能会导致性能问题。@AbassA是的,我必须输入Person,这是您调用
System.out.println(persons)时的原因代码>,它为列表中的每个人调用toString方法,并且由于您尝试在Person类的toString方法中打印电话,因此会出现LazyInitializationException。所以只需从toString中删除phones属性。它应该work@Abassa是的,但是当您的toString方法返回类似于soreturn“Person[Person\u id=“+Person\u id…”的字段时,phones=“+phones+”]";代码>我不调用getPhone方法不应该只返回null?您是否在Person类中的toString方法中打印phones属性?当您需要指定必须如何获取关系时,Fetchmode非常有用。通过联接或选择FectMode。请参阅文档:根据您的数据库模型,选择其中一个可能会导致性能问题。@AbassA是的,我必须输入Person,这是您调用System.out.println(persons)时的原因代码>,它为列表中的每个人调用toString方法,并且由于您尝试在Person类的toString方法中打印电话,因此会出现LazyInitializationException。所以只需从toString中删除phones属性。它应该work@Abassa是的,但是当您的toString方法返回类似于so的字段时返回“Person[Person\u id=“+Person\u id…”,phones=“+phones+”]”;
我不调用getPhone方法不应该只返回null?
Failed to write HTTP message: org.springframework.http.converter.HttpMessageNotWritableException: Could not write content: failed to lazily initialize a collection of role: com.app.person.Person.phones, could not initialize proxy - no Session
System.out.println(persons);