java - 使用 JSONArray.fromObject 将 Hibernate 实体转换为 json

标签 java json hibernate

我在将数据转换为 json 时遇到问题。

Session session = sessionFactory.openSession();       
Affiliate affiliate = (affiliate) session.get( Affiliate , pk );
session.close();
JSONArray.fromObject(affiliate);

调试器显示已获取该行。
但在尝试转换为 json 字符串时出现此异常:

Exception in thread "main" net.sf.json.JSONException: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.affiliates.hibernate.Affiliate.employees, no session or session was closed
at net.sf.json.JSONObject._fromBean(JSONObject.java:959)    ...

这是我的附属实体

    @Entity(name="AFFILIATE")
    @Inheritance(strategy=InheritanceType.SINGLE_TABLE)
    public class Affiliate extends HibernateBean{ 

        @Id
        @GeneratedValue(strategy=GenerationType.IDENTITY) 
        @Column(name="AFFILIATE_ID")
        private long id;

        @ManyToOne(targetEntity = Affiliate.class)
        @JoinColumn(name="PARENT_ID")
        private Affiliate parent;



        @ManyToMany(cascade=CascadeType.ALL,fetch=FetchType.LAZY)
        @JoinTable(name="EMPLOYEES_AFFILIATES"  , joinColumns = {@JoinColumn(name="AFFILIATE_ID")},inverseJoinColumns={@JoinColumn(name="EMPLOYEE_ID")})
        private Set<Employee> employees = new HashSet<Employee>(0);

 getters and setters...

    }

谢谢

最佳答案

您的 employees 集合被标记为 FetchType.LAZY,因此它是延迟获取的,并且在 session 关闭时无法获取。

您有多种选择:

  • 如果每次加载 Affiliate 对象时都需要该集合,请将其标记为急切获取:

    @ManyToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER) 
    
  • 如果您仅在这种特殊情况下需要该集合,请指示 Hibernate 在这种情况下立即加载它:

    • 使用 JOIN FETCH 子句:

      Affiliate affiliate = (Affiliate) session.createQuery(
          "from Affiliate a join fetch a.employees where a.id = :id")
          .setParameter("id", pk).uniqueResult()
      
    • 使用Hibernate.initialize():

      Affiliate affiliate = (Affiliate) session.get( Affiliate , pk );  
      Hibernate.initialize(affiliate.getEmployees());
      
    • Fetch Profiles

  • 在响应准备好之前不要关闭 session 。使用Open Session in View模式。

关于java - 使用 JSONArray.fromObject 将 Hibernate 实体转换为 json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4874879/

相关文章:

ios - NSURLConnection 不调用方法(第一次工作)

java - 使用 Hibernate Criteria 自加入

hibernate - 当repository.save时Spring Boot + JPA + Hibernate不提交

java - 你如何在 drools 中激活规则流组

java - fragment Activity 不附加到主要

java - 如何修复嵌入字体 (Java) 的 FileNotFoundException?

javascript - 面对超过 2000 个项目时,Dynatree 返回错误

json - 如何使用 Go 从 JSON 文件中读取一个值

java - 出现以下错误 org.hibernate.MappingException : No Dialect mapping for JDBC type: -1

java - 使用 Keystore 存储 key