ORM从多个数据库表创建单个实体

时间:2013-11-04 12:08:23

标签: entity-framework hibernate nhibernate orm

经过良好测试的运行系统已定义了名为“用户”的实体。

现在我需要向User实体添加一个新属性(例如:Age) 为了安全地执行此操作,我不喜欢使用现有数据库表进行任何更改,因为在我的情况下这非常危险。我需要一种方法来使用最少的代码更改来重建User实体。

所以我的建议是:

  • 创建一个新表(user_age),其中包含两列(user_id,age)
  • 修改用户实体以添加属性'age'及其getter-setters
  • 所以我的实体(用户)属性将保存到两个不同的表(user和user_age)
  • 加载用户也是类似的。

这可能与休眠有关吗?? ??

如果没有,用Hibernate做任何其他更安全的方法......?

提供此类功能的可用ORM有哪些(nhibernate,entityframwork等......或任何其他ORM)......?

3 个答案:

答案 0 :(得分:1)

是的,有各种方法:

[1]参见JPA二级表。这允许您将实体映射到两个或更多表。

第2.2.7节:http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/#d0e2235

[2]创建另一个实体,比如UserInfo,映射到这个新表。创建从User到UserInfo的一对一映射。

答案 1 :(得分:0)

是。你可以这样做。
我用过类似的问题joined-subclass

<强>基

<class name="User" table="Users">
   <id name="Code" type="System.Guid">
      <column name="Code" />
      <generator class="guid.comb" />
    </id>
    ...
</class>

<强>子类

<joined-subclass name="UserExt" extends=User" table="UsersExt">
    <key column="Code" />

    <property name="Age">
        <column name="Age" not-null="true" />
    </property>
</joined-subclass>

一个很好的参考here

答案 2 :(得分:0)

NHibernate的join映射就是针对这种情况。

有关详细信息,请参阅Ayende's blogdocumentation。来自文档:

  

使用<join>元素,当表之间存在一对一的关系时,可以将一个类的属性映射到多个表。

在我的搜索中,看起来也可以使用Entity Framework执行此操作:Simon J Ince - Mapping two Tables to one Entity in the Entity Framework 。我认为这篇文章是关于Entity Framework v1的,现在可能已经发生了变化,但似乎Entity Framework的这个映射版本有一个重要的限制:

  

...它需要每个表中的记录存在,因为生成的SQL使用INNER JOIN。如果您正在使用新模型,这是有道理的,但我想如果您映射到现有模式和数据,这将更加棘手。

使用NHibernate,您可以在optional映射上设置join属性,以告诉它使用外连接而不是内连接。

  

optional(可选 - 默认为false):如果启用,NHibernate将仅在此连接定义的属性为非null时才插入行,并始终使用外部联接来检索属性。