代码之家  ›  专栏  ›  技术社区  ›  chiccodoro

[n]休眠:查看相关类的获取属性

  •  0
  • chiccodoro  · 技术社区  · 15 年前

    (在制定适当的标题时感到非常无助…)

    是否可以为类定义映射,以便使用联接查询从另一个表中提取某些属性?

    在我的C应用程序中,我显示了“A”对象的列表,以及它们关联的“B”对象的一些属性和B关联的“C”对象的属性:

    A.Name    B.Name    B.SomeValue    C.Name
    Foo       Bar       123            HelloWorld
    Bar       Hello     432            World
    ...
    

    要澄清:A有FK到B,B有FK到C(例如,BankAccount->Person->Company)。

    如果我通过属性“bname”、“bsomevalue”和“cname”扩展类A,我可以使[n]Hibernate发出类似的查询吗?

    select A.Name, B.Name as BName, B.SomeValue as BSomeValue, C.Name as CName
    from A
    join B on A.B_ID = B.ID
    join C on B.C_ID = C.ID
    

    并将这些查询的所有结果映射到a的属性上?


    背景:

    我尝试了两种方法从数据库中加载这些属性(使用nhibernate):快速方法和干净方法。我的 最终的问题 是怎么做的 快速清理 方法。

    快速进场:

    • 在数据库中定义连接A、B、C并提供所有这些字段的视图。
    • 在A类中,定义属性“bname”、“bsomevalue”、“cname”
    • 定义A和视图之间的休眠映射,而所需的B和C属性则用 update="false" insert="false" 实际上是从B和C表中派生出来的,但是Hibernate不知道这一点,因为它使用视图。

    这样,列表只为每个“A”记录加载一个对象,这非常快。如果代码试图访问实际的关联属性“a.b”,我会发出另一个HQL查询来获取b,设置该属性并更新伪造的bname和bsomeValue属性。

    清洁方法:

    • 没有风景。
    • A类映射到表A、B到B、C到C。
    • 加载a的列表时,我会执行双左联接获取以获取b和c: from A a left join fetch a.B left join fetch a.B.C
    • b.名称、b.someValue和c.名称通过热切加载的关联进行访问。

    这种方法的缺点是速度变慢,占用了更多的内存,因为它需要为每个“A”记录创建和映射3个对象:每个A、B和C对象。

    快速干净的方法:

    使用隐藏连接的数据库视图,并将其作为表在nhibernate中处理,我觉得有点不舒服。所以我想做一些类似的事情:

    • 数据库中没有视图。
    • 在类“A”中声明属性“bname”、“bsomevalue”、“cname”。
    • 定义的映射,以便nhibernate像数据库视图那样使用join-sql查询将a和这些属性一起提取。
    • 映射仍应允许定义惰性的多对一关联以获取a.b.c。

    我的问题:

    • 这有可能吗?
    • 这是不是很巧妙?
    • 有更好的方法吗?
    1 回复  |  直到 15 年前
        1
  •  1
  •   Diego Mijelshon    15 年前

    你的“干净”方法最接近它应该是怎样的(其他方法甚至不值得尝试)。

    在去之前 join fetch 你应该看看会发生什么 没有 它。根据使用情况,您可能会发现这已经足够好了。

    你可能还想了解 batch-size caching 在文档中。

    最重要的是,在发现实际问题之前,你不应该尝试进行微优化。当你说 “这种方法的缺点是速度变慢,占用更多内存。” 我想你还没有真正测量过。

    推荐文章