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



我有一个抽象类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;
}

这是饲料DAO:

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

当我查询库存DAO时,设置了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,则始终设置源字段。

InventoryDAO: {"id":1,"feed":{"id":10}

,"feedId":10}

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

根据这里给出的答案:

**

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

**

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

最新更新