我有一个抽象类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功能时,它会打印延迟加载的对象。