[英]Java Hibernate Entities not joined correctly (bidirectional)
我有兩個具有oneToMany
關系的Java
Hibernate
實體。 另外我在前端有Spring
控制器和AngularJS
。 當我在Chrome
瀏覽器上嘗試/cars/getCars
時,我的網絡狀態失敗。 並且Eclipse停止工作(凍結)。
@Entity
@Table(name="auto")
public class Make {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
@Column(length = 100)
private String make;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "make")
private List<Model> models = new ArrayList<Model>(0);
public String getMake() {
return make;
}
...
}
和
@Entity
@Table(name="models")
public class Model {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
@Column(length = 100)
private String model;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "fk_maker")
private Make make;
public Model() {}
public void setModel(String model){
this.model = model;
}
...
道
public List<Make> getCars(){
Criteria criteria = session.createCriteria(Make.class);
return criteria.list();
}
和Spring
控制器:
@RequestMapping("/cars/getCars")
public @ResponseBody List<Make> getCars(){
DAO d = new DAO();
return d.getCars();
}
對我來說,看起來像n + 1查詢問題。
以及來自異常的片段:
..at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:157)
at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serializeContents(CollectionSerializer.java:149)
at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:111)
at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:24)
at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:656)
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:675)
at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:157)
at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:656)
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:675)
at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:157)
at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serializeContents(CollectionSerializer.java:149)
at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:111)
at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:24)
at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:656)
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:675)
at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:157)
at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:656)
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:675)
at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:157) ...
如果更改為: @OneToMany(fetch = FetchType.LAZY, mappedBy = "make") to @OneToMany
,則從Model
類中刪除一個make
字段,而不是正常工作,但是現在我無法通過model
獲取make
。
這個問題似乎與具有休眠雙向關系的json解析有關。
您需要在@ManyToOne之后添加@JsonIgnoreProperties,此注釋來自jackson2。import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
@Entity
@Table(name="auto")
public class Make {
...
@OneToMany(fetch = FetchType.LAZY, mappedBy = "make")
@JsonIgnoreProperties(value = "make") // to ignore the make from Model class while parsing to your json/xml
private List<Model> models = new ArrayList<Model>(0);
...
}
同樣,
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "fk_maker")
@JsonIgnoreProperties(value = "models") // to ignore the models from Make class while parsing to your json/xml
private Make make;
這種方法在@ManyToMany中為我工作,希望對您有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.