2016-04-13 3 views
0

なぜこのエラーが発生していますか?私のサービスIMPLでエンティティをdtoに変換するときのmvc、hibernate LazyInitializationExceptionのエラー

@OneToMany(fetch = FetchType.LAZY, mappedBy = "person", cascade = CascadeType.ALL) 
    private Set<Contact> contacts; 

    @ManyToMany(fetch = FetchType.EAGER) 
    @JoinTable(name = "PERSON_ROLE", joinColumns = { 
      @JoinColumn(name = "person_id", nullable = false, updatable = false) }, 
      inverseJoinColumns = { @JoinColumn(name = "role_id", 
        nullable = false, updatable = false) }) 
    private Set<Role> roles = new HashSet<Role>(0); 

私の人物モデルのこの

@Transactional 
@Repository 
public class PersonDaoImpl implements PersonDao{ 

    @Autowired 
    private SessionFactory sessionFactory; 

    @SuppressWarnings("unchecked") 
    @Override 
    @Transactional(readOnly=true) 
    public List<Person> getAllPersons(){ 
     List<Person> persons = (List<Person>) sessionFactory.getCurrentSession() 
      .createCriteria(Person.class) 
      .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY) 
      .list(); 
     return persons; 
    } 
を呼び出して、私のdaoImplイムの一部である部分は、私が間違って何をやっている BeanUtils を使用してDTOにモデルを変換しますか?

答えて

1

BeanUtilsを使用してエンティティをdtoに変換しようとすると、エンティティはすでにデタッチされています(たとえば、永続コンテキスト/休止状態のセッション外)。あなたのPersonクラスには遅れてロードされたSet<Contact>の連絡先があります - それが失敗する理由です。

Contactに多くのリレーションが含まれていない場合は、FetchType.EAGERに変更するか、Personがまだアタッチされている間にエンティティを変換できます。 々BeanUtilsで

+0

FetchTypeをEAGERに変更すると、私の作品になります。ありがとう –

0

次のように、あなたは、Hibernate経由でオブジェクトを初期化する必要があります。Hibenrate.initialize(PF)を使用して

MyProfile pf = null; 
    try { 
     session.beginTransaction(); 
     Query query = session.createQuery("from MyProfile as term where term.profileId=:pId "); 
     query.setString("pId", pid); 
     pf = (MyProfile)query.uniqueResult(); 
     if(pf != null) 
     { 
      Hibernate.initialize(pf); 
     } 
    } catch (HibernateException he) { 
     throw he; 
    } 

は、マイプロファイルオブジェクトの内部に含まれるオブジェクトを初期化します。

関連する問題