【问题标题】:Best Fetching Practices in Hibernate Mapping (Many-To-One)Hibernate 映射中的最佳获取实践(多对一)
【发布时间】:2012-05-25 15:40:53
【问题描述】:

我在使用 hibernate 进行多对一映射时遇到问题。我有两个表,表 A 和表 B。我映射了这些表之间的多对一关系。两个表可以一起使用,也可以单独使用。

用 Java 中的类来表示表,例如:

class A{ 
 private B b; 
 private Integer val1; 
 private Integer val2; 
 private Integer val3; 
}

class B{
 private Integer val1;
 private Integer val2;
 private Integer val3;
}

问题是每当我尝试从表 A 中检索/获取记录时,hibernate 也会一直从表 B 中获取我不想要的记录。它导致性能问题。他们有什么办法来处理这种情况吗?

请给我一个合适的答案。

【问题讨论】:

    标签: java hibernate


    【解决方案1】:
    @ManyToOne(lazy = true)
    private B b;
    

    这就是你所需要的。阅读hibernate documentation 了解更多详情。

    【讨论】:

    • +1 附带说明:如果您打算对 collections 使用延迟提取,您应该查看Fetching Strategies 并确定哪种策略最适合您的需求。
    • 我没有使用Annotation...我在hbm中放了lazy=true,但它不接受真实值。
    • docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/…:向下滚动一点,阅读您可以设置的所有属性及其文档。 lazy="proxy" 是你想要的,也是默认的。
    【解决方案2】:

    您的要求符合Lazy Initialization。为了实现它,您可以添加注释或在检索数据时使用休眠会话的get 方法。

    在你的情况下,你可以这样写:

    Session session = SessionFactory.getCurrentSession();
    A aObject= (A) session.get(A.class, A_ID);
    

    正如https://community.jboss.org/wiki/AShortPrimerOnFetchingStrategies?_sscc=t 链接中所述:

    如果您通过 get() 或 load() 通过标识符检索单个实体实例,Hibernate3 会加载它。不会加载为此实体映射的所有集合以及所有关联实体,无论是通过多对多还是对一关联。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-24
      • 2023-03-16
      • 2013-04-13
      • 2011-04-11
      • 2011-06-14
      • 1970-01-01
      • 2020-04-19
      相关资源
      最近更新 更多