Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring Hibernate FetchType LazyInitializationException,即使在不调用关联时也是如此_Java_Hibernate - Fatal编程技术网

Java Spring Hibernate FetchType LazyInitializationException,即使在不调用关联时也是如此

Java Spring Hibernate FetchType LazyInitializationException,即使在不调用关联时也是如此,java,hibernate,Java,Hibernate,我刚刚开始学习懒惰和渴望。我理解其中的区别,但即使我设置为懒惰,它仍会以某种方式试图获取相关数据 关系:1人:多部手机 查看的研究尝试和教程: 我知道要获取相关数据,我需要在会话()中执行此操作,因此对于Dao中的特定示例,我需要这样的内容 List<Person> persons = criteria.list(); for(Person person : persons){ Set sets = person.getPhones();

我刚刚开始学习懒惰和渴望。我理解其中的区别,但即使我设置为懒惰,它仍会以某种方式试图获取相关数据

关系:1人:多部手机

查看的研究尝试和教程:

我知道要获取相关数据,我需要在会话()中执行此操作,因此对于Dao中的特定示例,我需要这样的内容

  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方法返回类似于so
return“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);