簡體   English   中英

將實體轉換為dto時,Spring MVC,休眠LazyInitializationException

[英]Spring mvc, hibernate LazyInitializationException when converting entity to dto

為什么我收到此錯誤? 這是我的daoImpl Im呼叫的一部分

@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;
    }

我的人形模型的一部分

@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);

在我的服務展示中,我使用BeanUtils將模型轉換為dto,這是我做錯了什么?

我的感覺是,當您嘗試使用BeanUtils將實體轉換為dto時,該實體已經分離(例如,外部持久性上下文/休眠會話)。 在您的Person類中,有一個Set<Contact>聯系人Set<Contact> ,它被延遲加載-這就是失敗的原因。

如果“ Contact ”不包含許多關系,則可以將其更改為FetchType.EAGER ,也可以在仍附加“ Person情況下轉換實體。

在BeanUtils中,您需要通過Hibernate初始化對象,如下所示:

    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;
    } 

使用Hibenrate.initialize(pf)將初始化MyProfile對象中包含的對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM