经过良好测试的运行系统已定义了名为“用户”的实体。
现在我需要向User实体添加一个新属性(例如:Age) 为了安全地执行此操作,我不喜欢使用现有数据库表进行任何更改,因为在我的情况下这非常危险。我需要一种方法来使用最少的代码更改来重建User实体。
所以我的建议是:
这可能与休眠有关吗?? ??
如果没有,用Hibernate做任何其他更安全的方法......?
提供此类功能的可用ORM有哪些(nhibernate,entityframwork等......或任何其他ORM)......?
答案 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 blog和documentation。来自文档:
使用
<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时才插入行,并始终使用外部联接来检索属性。