簡體   English   中英

Java Hibernate實體未正確連接(雙向)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM