我有一个抽象类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的限制?
答案 0 :(得分:0)
答案 1 :(得分:0)
因此,经过进一步测试,似乎com.fasterxml.jackson.datatype.hibernate4.Hibernate4Module JSON映射器忽略了延迟加载的对象,除非它们已经在会话中。如果我在InventoryDAO对象上调用getFeed()。getId(),Hibernate会从数据库中提取feed对象,它包含在JSON中。当我为Hibernate4Module启用Hibernate4Module.Feature.FORCE_LAZY_LOADING功能时,它会打印延迟加载的对象。