我有两个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;
}
}
答案 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)