[英]LazyInitializationException with hibernate and spring mvc
[英]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.