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

fat*_*zzy 2 java json hibernate

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

Session session = sessionFactory.openSession();       
Affiliate affiliate = (affiliate) session.get( Affiliate , pk );
session.close();
JSONArray.fromObject(affiliate);
Run Code Online (Sandbox Code Playgroud)

调试器显示该行已被提取.
但我尝试转换为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)    ...
Run Code Online (Sandbox Code Playgroud)

这是我的会员实体

    @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...

    }
Run Code Online (Sandbox Code Playgroud)

谢谢

axt*_*avt 6

您的employees集合被标记为FetchType.LAZY,因此它会被延迟取出,并且在会话结束时无法获取.

你有几个选择:

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

    @ManyToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER) 
    
    Run Code Online (Sandbox Code Playgroud)
  • 如果只在这种特殊情况下需要该集合,请指示Hibernate在这种情况下急切加载它:

  • 在响应准备好之前不要关闭会话.在View模式中使用Open Session.