Hibernate ManyToOne和OneToMany

时间:2013-08-20 06:01:28

标签: hibernate behavior

我已将这种关系映射为例如。

@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;

    ...

}

调用Local getEvent()时会在Colletion中加载一个带有一些事件的列表,但是每个事件都在另一个Shop里面,可能在另一个事件内部连续发生..这样可以吗?响应JSON结构可以做任何问题吗?

2 个答案:

答案 0 :(得分: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;

    ...

 }

我希望这些信息有用。我还不能添加评论。

答案 1 :(得分:1)

Hibernate 使用提取的数据的标识检查数据,并存储在单个对象中。通过这种方式,hibernate识别要提取的数据,并且仅获取所需的数据。因此负载将是最小的。

但是当您不需要任何其他细节时,最好不使用此Entity类及其中的关系来获取数据。因为它只是购买了太多的数据。您可以将此作为一个不错的选择

例如 如果您只需要表雇员中的员工姓名作为付款表中的Id,那么您可以使用VO Class并仅选择您需要的值。

按照步骤

  1. 创建一个新类(不是映射到表的实体类)
  2. 使用与列类型相同的类型为每个列声明变量,并创建getter和setter。
  3. 创建一个构造函数,其中字段作为参数,与您要获取查询的顺序相同。
  4. 执行查询(也可以使用内部联接

    从表1 A,表2B中选择A.Col1,A.Col2,A.Col3,B.Col1,B.Col2,其中A.RelationId = B.ID;

    A.RelationId=B.ID 是两个表之间的关系。

  5. 您将获得类voClassName的对象,其中包含您需要的值。

    有关使用关系和映射提升效果的更多详细信息,请参阅参考手册中的section 21.1 of "Improving Performance"