java - Spring mvc、hibernate将实体转换为dto时出现LazyInitializationException

标签 java spring hibernate

为什么我会收到此错误?这是我调用的 daoImpl 的一部分

@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 时该实体已经分离(例如,外部持久化上下文/hibernate session )。在你的Person类你有一个 Set<Contact>延迟加载的联系人 - 这就是它失败的原因。

如果Contact不包含很多关系,您可以将其更改为 FetchType.EAGER或者您可以在 Person 时转换实体仍然附加。

关于java - Spring mvc、hibernate将实体转换为dto时出现LazyInitializationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36587528/

相关文章:

java - Hibernate 不生成 id

java - 如何清理由 Runtime.exec() 启动的进程?

mysql - Hibernate 未检测到 MySQL 更改

java - spring 应用程序不启动 : SAXParseException: Document root element "beans", 必须匹配 DOCTYPE root "null"

java - 如何获取用于记录的(未)编码消息

java - 对于总是很慢的服务,REST API 请求超时

java - Spring:在 Autowiring 组件时选择构造函数

java - 如何捕获 org.springframework.dao.DataIntegrityViolationException : Could not execute JDBC batch update

Java、Eclipse。如何让扫描仪同时读取小写和大写?

java - 在java中的字符串中查找 "\"的最后一个索引