0

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

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

所以我的建议是:

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

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

如果没有,还有其他更安全的方式来使用 Hibernate 执行此操作......?

提供这种功能的可用 ORM 有哪些(nhibernate、entityframwork 等...或任何其他 ORM)...?

4

3 回答 3

1

是的,有多种方法:

[1] 请参阅 JPA 辅助表。这允许您将实体映射到两个或多个表。

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

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

于 2013-11-04T12:14:18.697 回答
0

是的。你可以这样做。
我用过类似的问题 a 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>

一个很好的参考在这里

于 2013-11-04T17:57:56.880 回答
0

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

有关更多信息,请参阅Ayende 的博客文档。从文档中:

使用该<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 将仅在此连接定义的属性为非空时插入一行,并且将始终使用外部连接来检索属性。

于 2013-11-06T02:14:07.847 回答