ORM 从多个数据库表创建单个实体
Posted
技术标签:
【中文标题】ORM 从多个数据库表创建单个实体【英文标题】:ORM to create single entity from more than one database tables 【发布时间】:2013-11-04 12:08:22 【问题描述】:经过良好测试的运行系统已经定义了名为“用户”的实体。
现在我需要向用户实体添加一个新属性(例如:年龄) 为了以安全的方式执行此操作,我不喜欢对现有数据库表进行任何更改,因为在我的情况下这是非常危险的。我需要一种以最少的代码更改来重建用户实体的方法。
所以我的建议是:
创建一个新表 (user_age),包含两列 (user_id, age) 修改用户实体以添加属性“age”及其getter-setter 所以我的实体(用户)属性,将被保存到两个不同的表(用户和用户年龄) 加载用户也是类似的。这可能与休眠有关吗....??
如果没有,还有其他更安全的方式来使用 Hibernate...?
提供这种功能的可用 ORM 有哪些(nhibernate、entityframwork 等...或任何其他 ORM)...?
【问题讨论】:
你是指Hibernate,还是NHibernate?也就是说,您是在使用 .NET 还是在 Java 中工作? 我在做ORM的一般分析,所以不用担心java或.net 但是你说你已经有了一个“经过良好测试的运行系统”。这个系统是用什么语言运行的?你是在暗示你愿意放弃所有好的、已经稳定的代码,只是为了实现这一功能? @JanakaPriyadarshana:你应该在某个时候接受答案。 【参考方案1】:是的,有多种方法:
[1] 请参阅 JPA 辅助表。这允许您将实体映射到两个或多个表。
第 2.2.7 节:http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/#d0e2235
[2] 创建另一个实体,比如 UserInfo,映射到这个新表。创建从 User 到 UserInfo 的一对一映射。
【讨论】:
【参考方案2】:是的。你可以这样做。
我用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。
【讨论】:
【参考方案3】: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,您可以在 join
映射上设置 optional
属性,以告诉它使用外连接而不是内连接。
optional
(可选 - 默认为false
):如果启用,NHibernate 将仅在此连接定义的属性非空时插入一行,并且始终使用外连接来检索属性。
【讨论】:
以上是关于ORM 从多个数据库表创建单个实体的主要内容,如果未能解决你的问题,请参考以下文章