【问题标题】:Hibernate ManyToOne/N+1 Issue休眠多对一/N+1 问题
【发布时间】:2013-03-28 02:39:44
【问题描述】:

我有一个持久类,其中包含与我的用户表的 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;
}
}

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

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

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

谁能帮帮我?

杰森

【问题讨论】:

    标签: hibernate


    【解决方案1】:

    似乎@Fetch(value=FetchMode.SELECT) 注释和@ManyToOne(optional=false, fetch=FetchType.LAZY) 会互相争斗,您是否尝试删除@Fetch(value=FetchMode .SELECT) 并将 fetch=FetchType.LAZY 添加到两个关联?

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

    【讨论】:

    • 尝试了,但没有成功。我假设缺少外键会损害我延迟加载多对一关系的能力。
    • 好的,我用另一个建议更新了我的答案。
    • 我接受了你的回答。在进一步的研究中,看起来 NotFound 正在启动附加查询。我希望在 ManyToOne 可以为空的情况下两全其美,但 NotFound 不会启动额外的查询。
    猜你喜欢
    • 1970-01-01
    • 2011-03-24
    • 2011-05-20
    • 2011-07-30
    • 2019-12-15
    • 1970-01-01
    • 1970-01-01
    • 2021-04-26
    • 1970-01-01
    相关资源
    最近更新 更多