在我的商家域中,两个实体Request
和Action
属于一对一关联,如下所示:
我通过休眠来坚持他们。问题是,如果我将它们保存在两个表中,我将不得不面对1 + n问题。如果我将它们保存在一个表中(通过从同一个超类中继承它们),hibernate使用鉴别器,这样它们就会在表的两个不同的行中结束,这意味着相同的1 + n问题。
是否有可能将这两个实体的关联实例保存在具有相同Id的表的同一行的不同列中?或者更好的想法来处理这种情况?
答案 0 :(得分:0)
您是否考虑过懒惰动作。这样可以避免在实际需要之前获取Action。例如
@OneToOne(fetch = FetchType.LAZY,optional = true)
答案 1 :(得分:0)
如果请求和操作都是实体,我更喜欢一对一的解决方案。我使用条件查询并指定获取模式来加入以避免n + 1问题。
Criteria c = session.createCriteria(Request .class);
c.setFetchMode("action", FetchMode.JOIN)
return c.list();
但是,如果您的请求与多个实体相关联,则必须开发许多即席查询方法,这有点麻烦。
public interface RequestRepository {
List<Request> findWithAction(Criteria criteria);
List<Request> findWithAnotherEntity(Criteria criteria);
}
如果Action只是 ValueObject ,我使用@Embeded,因此它们可以存储在一个表中。
答案 2 :(得分:0)
不,不应该使用两个实例来代表同一行,就像你去删除其中一个实体时会发生什么一样?为什么不只使用一个实体和一个嵌入?假设没有请求就不能存在Action,它将是可嵌入的并存在于Request表中。