0

例如,我映射了这种关系。

@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() 时,会在集合中加载一个包含一些事件的列表,但是每个事件都在另一个商店中,可能在另一个事件中,然后.. 可以吗?响应 JSON 结构有什么问题吗?

4

2 回答 2

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;

    ...

 }

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

于 2013-08-20T08:48:31.337 回答
1

Hibernate使用获取的数据的身份检查数据并存储在单个对象中。通过这个休眠识别要获取的数据,它只获取所需的数据。因此负载将是最小的。

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

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

按照步骤

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

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

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

您将获得具有所需值的类 voClassName 的对象。

有关使用关系和映射提高性能的更多详细信息,请参阅参考手册中“提高性能”的第 21.1 节。

于 2013-08-21T05:44:03.407 回答