Hibernate 冬眠一个又一个

Hibernate 冬眠一个又一个,hibernate,behavior,Hibernate,Behavior,例如,我映射了这种关系 @Entity @Table(name = "shop") public class Shop implements Serializable { ... @OneToMany(mappedBy = "shop", fetch=FetchType.LAZY) private Set<Event> events; ... } 调用Local getEvent()时,会在Colletion中加载一个包含几个事件的列表,但另

例如,我映射了这种关系

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

    ...

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

    ...

}

调用Local getEvent()时,会在Colletion中加载一个包含几个事件的列表,但另一个商店中的每个事件都可能包含另一个事件并依次加载。。可以吗?。响应JSON结构有什么问题吗?

我在序列化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;

    ...

 }
@实体
@表(name=“shop”)
公共类商店实现了可序列化{
...
@杰索尼奥雷
@OneToMany(mappedBy=“shop”,fetch=FetchType.LAZY)
私人设置的事件;
...
}

我希望这些信息有帮助。我还不能添加注释。

我在序列化到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;

    ...

 }
@实体
@表(name=“shop”)
公共类商店实现了可序列化{
...
@杰索尼奥雷
@OneToMany(mappedBy=“shop”,fetch=FetchType.LAZY)
私人设置的事件;
...
}

我希望这些信息有帮助。我还不能添加注释。

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

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

例如 如果您只需要支付表中Id的表employee中的员工姓名,则可以使用VO类并仅选择所需的值

按照步骤操作

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

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

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

  • 您将获得一个voClassName类的对象,其中包含您需要的值


    有关使用关系和映射提高性能的更多详细信息,请参见参考手册中的。Hibernate使用获取的数据的标识检查数据,并将其存储在单个对象中。通过这种方式,hibernate识别要获取的数据,并且只获取所需的数据。因此,负载将是最小的

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

    例如 如果您只需要支付表中Id的表employee中的员工姓名,则可以使用VO类并仅选择所需的值

    按照步骤操作

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

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

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

  • 您将获得一个voClassName类的对象,其中包含您需要的值


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

    您的问题并不完全清楚。如果是关于定义关系的双方是否会导致循环/无限依赖之类的问题,那么不,不用担心。将对象序列化为JSON也不应该是个问题,当然您需要自己编写序列化代码。我使用MappingJackson2JsonView来完成,有问题吗?@Dani您是否希望知道在使用它时是否存在任何性能问题。?是的,这就是问题所在,迪利普。你问什么还不完全清楚。如果是关于定义关系的双方是否会导致循环/无限依赖之类的问题,那么不,不用担心。将对象序列化为JSON也不应该是个问题,不过当然你需要自己编写序列化代码。我使用MappingJackson2JsonView来做,有问题吗?@Dani你是否希望知道使用它是否会有任何性能问题。?是的,这是个问题@Dileep。谢谢@paulek,对我来说非常好,我只有一个问题,我不需要序列化这个字段,但是,我需要它的非序列化。那么我想我必须把JsonIgnore放在getter中,而不是setter中,是吗?@Dani正如你所说的那样。谢谢@paulek,对我来说太完美了,我只有一个问题,我不需要序列化这个字段,但是,我需要它在unserialize中。“那么我想我必须把杰索尼奥雷放在盖特而不是塞特,是吗?”丹尼,正如你所说的。