如何使用休眠

时间:2016-03-11 20:05:03

标签: hibernate jpa orm jpa-2.0

我有两个hibernate注释类。我在FirstTable上做了一个hibernate查询。从列表中检索数据后,使用GSON将对象转换为JSON字符串。转换后的JSON字符串也将包含子表的数据。我的要求是阅读第一级数据。它不应该查询子表。

已尝试的步骤

要在获取对象后实现此目的,我已将对象与entitymanager分离(也尝试了session.evict)。关闭hibernate会话和entitymanager对象。试图将对象转换为JSON。这样做我得到LazyInitializationException。有解决方法还是有其他方法可以实现这一目标。

@Entity(name = "FirstTable")
@Table(name = "FirstTable")
@AccessType("property")
public class FirstTable {
    private SecondTable _SecondTable;
    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "SecondTable_ID")
    public SecondTable getSecondTable() {
        return _SecondTable;
    }
    public FirstTable setSecondTable(SecondTable value) {
        this._SecondTable = value;
        return this;
    }
    private long id;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name="Id")
    public long getId() {
        return id;
    }
    public void setId(long id) {
        this.id=id;
    }
}

@Entity(name = "SecondTable")
@Table(name = "SecondTable")
@AccessType("property")
public class SecondTable {
    private String _RandomCol;
    @Column(name="RandomCol")
    public java.lang.String getRandomCol() {
        return _RandomCol;
    }
    public SecondTable setRandomCol(java.lang.String value) {
        this._RandomCol = value;
        return this;
    }
    private long id;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name="OId")
    public long getId() {
        return id;
    }
    public void setId(long id) {
        this.id=id;
    }
}

4 个答案:

答案 0 :(得分:0)

私人瞬态 SecondTable _SecondTable;

答案 1 :(得分:0)

我现在处理同样的问题。据我了解此回复JPA Hibernate collections not lazily loaded,如果您不想加载子级别,则不应该调用getChildren方法。但是看起来你在尝试将对象转换为json时实际调用了这个方法。

在您的情况下,如果可能尝试不自动将Object转换为Json,而是手动填充json,将实际需要的属性放入其中。如果您的情况不可行,请查看JPA + Hibernate - How to get FK of child entity without fetching that entity?

可能有更好的解决方案,但我没有找到它。

在这里找到了更好的方法hibernate entity to json

答案 2 :(得分:0)

LazyInitializationException正在发生,因为您正在尝试从事务中检索子对象 。即使您拥有detacted FirstTable实体,它仍然是一个实体,而SecondTable实体仍然是一个实体,并标记为未初始化。换句话说,FirstTable实体没有持有SecondTable类,而是SecondTable实体的代理,这就是抛出LazyInitializationException的实体。

如上所述,您可以通过首先将_SecondTable属性设置为null来修复它。然后json序列化器将忽略该属性。

创建DTO或Data Transfer Object更为典型。这是通过创建基本上是实体克隆的类来完成的,但只具有您想通过json传输的属性。

假设您打算使用RESTful服务,可能支持客户端视图框架,例如AngularJs,那么制定DTO将为您节省很多麻烦。

答案 3 :(得分:0)

同意尼古拉斯。

所以一个互补的事情,在我的上一部作品中,我使用了CXF的JACKSON提供程序。即使将data子元素设置为null,提供程序也会使用“null”序列化该属性(例如:{data = null})。 不知道这是我的错还是JACKSON-CXF夫妇。 使用像@JsonIgnore这样的注释可能是一个解决方案。

但是,如果您希望有一天在整体中转移实体,那么在您的实体上放置此类注释可能效率不高。也许有一天,这是必要的。 SO认为这样做与否。

所以,就我而言,我决定

1)让没有“JSON ANNOTATION”的实体转移,如果需要那么转移

2)创建智能DTO / POJO来传输数据(每个需求都没有DTO / POJO)