2013-08-20 168 views
0

我有這種關係映射爲例子。休眠ManyToOne和OneToMany

@Entity 
@Table(name = "shop") 
public class Shop implements Serializable { 

    ... 

    @OneToMany(mappedBy = "shop", fetch=FetchType.LAZY) 
    private Set<Event> events; 

    ... 

} 

@Entity 
@Table(name = "event") 
public class Event implements Serializable { 

    ... 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "shop_id", nullable = false) 
    private Shop shop; 

    ... 

} 

當本地getEvent()被調用時加載總彙一個列表有一些活動,但每個事件有另一家商店內可能有內另一個事件並先後..那是OK ?。可以響應JSON結構做任何問題嗎?

+1

這並不完全清楚你問的是什麼。如果定義關係的雙方是否會導致諸如循環/無限依賴等問題,那麼不,不要擔心。將對象序列化爲JSON也不應該成爲問題,當然你需要自己編寫序列化代碼。 – aroth

+0

我使用MappingJackson2JsonView來做什麼,有什麼問題? – Dani

+0

@Dani你是否期待知道使用它是否有任何性能問題.. ?? – Dileep

回答

2

我序列化過程中有問題JSON

... 
    at org.codehaus.jackson.map.ser.std.CollectionSerializer.serializeContents(CollectionSerializer.java:72) 
    at org.codehaus.jackson.map.ser.std.CollectionSerializer.serializeContents(CollectionSerializer.java:23) 
    at org.codehaus.jackson.map.ser.std.AsArraySerializerBase.serialize(AsArraySerializerBase.java:86) 
    at org.codehaus.jackson.map.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:446) 
    at org.codehaus.jackson.map.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:150) 
    at org.codehaus.jackson.map.ser.BeanSerializer.serialize(BeanSerializer.java:112) 
    at org.codehaus.jackson.map.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:446) 
    at org.codehaus.jackson.map.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:150) 
    at org.codehaus.jackson.map.ser.BeanSerializer.serialize(BeanSerializer.java:112) 
... 

爲了解決它,我用@JsonIgnore標註在一個屬性:

@Entity 
@Table(name = "shop") 
public class Shop implements Serializable { 

    ... 

    @JsonIgnore 
    @OneToMany(mappedBy = "shop", fetch=FetchType.LAZY) 
    private Set<Event> events; 

    ... 

} 

我希望這個信息是有幫助的。我還無法添加評論。

+0

謝謝@paulek,對我來說是完美的,我只有一個問題,我不需要序列化這個字段,但是,我需要它反序列化。那麼我認爲我必須把JsonIgnore放在getter中,但不要放在setter中,當然? – Dani

+0

@Dani正如你所說。 – paulek

1

休眠檢查數據的身份與獲取的數據並存儲在一個單一的對象。通過這個hibernate標識要提取的數據,並且只提取所需的數據。因此負載將是最小的。

但是,如果您不需要任何其他細節,則最好在不使用與其關係的實體類的情況下獲取數據。因爲它只是購買了太多的數據。你可以用這個作爲一個不錯的選擇

例如 如果你只需要一個Table Employee的員工名稱作爲付款表中的Id,那麼你可以使用VO Class並只選擇你需要的值。

按照以下步驟

  1. 創建一個新的類(沒有映射到表的實體類)
  2. 聲明變量每次需要使用相同類型的列類型的獲取和創建列獲得者和制定者。
  3. 按照您想要提取查詢的相同順序創建一個字段爲參數的構造函數。
  4. 執行查詢(也可以用內加入

    選擇A.Col1,A.Col2,A.Col3,B.Col1,B.Col2從表1 A,表2 B,其中A.RelationId = B.ID;

    A.RelationId=B.ID是兩個表之間的關係。

您將獲得具有您需要的值的voClassName類的對象。

請參閱參考手冊中的section 21.1 of "Improving Performance",以獲取有關使用關係和映射提升性能的更多詳細信息。