Hibernate @MappedSuperclass @ManyToOne(fetch = FetchType.LAZY)

时间:2015-04-16 04:35:11

标签: java hibernate jpa hibernate-mapping

我有一个抽象类AbstractDAO,我的所有其他DAO对象都扩展了。

@MappedSuperclass
public abstract class AbstractDAO implements Serializable {
    private static final long serialVersionUID = 1L;

    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="feed_id", insertable=false, updatable=false)
    @Getter @Setter private FeedDAO feed;

    @Column(name="feed_id")
    @Getter @Setter private Long feedId;
}

然后我有了扩展这个类的InventoryDAO:

@Entity
@Table(catalog="feed", name = "inventory")
public class InventoryDAO extends AbstractDAO {
    /**  Serial ID for this class  **/
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(generator="increment")
    @GenericGenerator(name="increment", strategy="increment")
    @Column(name="id")
    @Getter @Setter private Long id;
}

这就是FeedDAO:

@Entity
@Table(catalog="feed", name = "feed")
public class FeedDAO extends AbstractDAO {
    /**  Serial ID  **/
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(generator="increment")
    @GenericGenerator(name="increment", strategy="increment")
    @Column(name="feed_id")
    @Getter @Setter private Long id;
}

当我查询InventoryDAO时,设置了feedId字段,并且Feed字段为空。

  

InventoryDAO:{“id”:1,“feed”:null,“feedId”:10}

但是,如果我首先查询FeedDAO,然后查询InventoryDAO,则会设置Feed字段。

  

InventoryDAO:{“id”:1,“Feed”:{“id”:10},“feedId”:10}

现在,如果我将@ManyToOne(fetch = FetchType.LAZY)更改为@ManyToOne(fetch = FetchType.EAGER)并查询InventoryDAO,则始终会设置Feed字段。

  

InventoryDAO:{“id”:1,“Feed”:{“id”:10},“feedId”:10}

这是映射问题还是@MappedSuperclass的限制?

2 个答案:

答案 0 :(得分:0)

根据此处给出的answer

**

  

在不需要时加载所有属性效率不高。   所以在这种情况下,你可以声明你想要实体   在实际需要时加载。这称为延迟加载。

**

答案 1 :(得分:0)

因此,经过进一步测试,似乎com.fasterxml.jackson.datatype.hibernate4.Hibernate4Module JSON映射器忽略了延迟加载的对象,除非它们已经在会话中。如果我在InventoryDAO对象上调用getFeed()。getId(),Hibernate会从数据库中提取feed对象,它包含在JSON中。当我为Hibernate4Module启用Hibernate4Module.Feature.FORCE_LAZY_LOADING功能时,它会打印延迟加载的对象。