Hibernate ManyToOne / N + 1问题

时间:2013-03-27 17:59:15

标签: hibernate

我有一个持久化类,它包含与我的用户表的ManyToOne关系,以便进行审计。实际上,我的所有类都有这些字段,甚至是User类。

public class MyClass implements Serializable {

@Fetch(value=FetchMode.SELECT)
@ManyToOne(optional=false, fetch=FetchType.LAZY)
@NotFound(action = NotFoundAction.IGNORE)
@JoinColumn(name = "CREATE_USER_ID")
public User getCreatedBy() {
    return createdBy;
}

@Fetch(value=FetchMode.SELECT)
@ManyToOne(optional=false)
@NotFound(action=NotFoundAction.IGNORE)
@JoinColumn(name="USER_ID")
public User getLastUpdatedBy() {
    return lastUpdatedBy;
}
}

为了使这更好,一些maroon使大多数表中的审计字段成为CHAR(8),但T_USER中的字段为VARCHAR2(8),这意味着无法在它们上创建外键

Anyhoo,对MyClass的查询将启动查询以填充审计字段,然后依次启动查询以填充用户的审计字段。

我很少需要审计字段,所以我想让它们变得懒惰。不幸的是,我认为我在这里有很多工作,尤其是设计不良的架构。

有人可以帮助我吗?

杰森

1 个答案:

答案 0 :(得分:2)

似乎@Fetch(value = FetchMode.SELECT)注释和@ManyToOne(可选= false,fetch = FetchType.LAZY)会互相攻击,你试过删除@Fetch(value = FetchMode) .SELECT)为每个实体添加fetch = FetchType.LAZY给两个关联?

另一个原因可能是@NotFound注释与optional = false注释参数作斗争。一个人说可能有一个NULL,另一个说不可能。我相信,在* toOne关联中可以有空值的情况下,除非关联不能为NULL,否则不能进行延迟加载。