每个实体hibernate两个表
我有一个实体 – User
。 它由User.class
描述。
Hibernate为每个实体创建一个表,所以当我调用session.save(user)
,我的数据总是保存到该表中。
现在我需要另一个表用于相同User
类型的数据,我只需要将我的实体保存到该表。
数据结构 (类似这样):
table users_1_table{ string id; string username; } table users_2_table{ string id; string username; }
使用这个 :
session.save(user1,"users_1_table") session.save(user2,"users_2_table")
结果我应该在users_1_table
有user1
在users_1_table
user2
。
由于系统限制,我不能将这两个对象放在一个表中。 (即使创建额外的字段也是个坏主意)。
我可以不进行子类化吗? 使用programmaticaly hibernate配置?
前言:
即使在SO上,这也是一个被广泛提问的问题,并且答案也广泛地与Subclass
或实际上SuperClass
方法有关(例如[ 1 ])
实际答案:
在这些post[ 2 ],[ 3 ]中,他们建议使用带有EntityName
参数的xml映射。
因此,使用xml进行映射不需要supeclass,只需将EntityName
参数赋予两个相同的映射。
示例映射:
然后,根据您需要的实体类型,您可以调用适当的会话方法:
_session.Save("User1Object", user1)
要么
_session.Save("User2Object", user2)
post2和3被用作此片段的基础。 官方消息来源[ 4 ]
比赛结束后:
第一个问题的一个答案实际上链接到这篇文章[ 5 ],有不同的方法:
您对该对象的第一个实例说再见,将数据克隆到新实例并使用不同的名称保留该实例。 因此,不会违反Hibernate逻辑和每个人的内容:两个表中的相同数据并且没有使用子类。
那么,该方法的实现或代码或可信度是如此,我还没有测试过它。
另一个案例:
在这篇文章[ 6 ]中,有另一个人试图用更简单的东西挑战超类方法,但同样,最可信的答案表明不可能采用另一种方式, 官方的非xml方法是所谓的子类方法。
来源
[1] 如何使用hibernate / jpa注释将一个类映射到不同的表
[2]将两个相同的表(相同的模式……)映射到Hibernate中的同一个实体
[3] 如何将2个相同的表(相同的属性)映射到1个实体
[4] http://docs.jboss.org/hibernate/core/3.2/reference/en/html/mapping.html#mapping-entityname
[5] Hibernate 4:一个类映射两个表 – 如何在两个表上保留一个对象?
[6] 存在于多个目录中的实体的Hibernate注释
它也使用默认实体和另一个实体:
对于默认值,您可以使用该方法
_session.Save(user1)
和
_session.Save("User2Object", user2)
替代的。
您可以使用配置执行此操作:
- 为同一个Entity Class
name
创建两个映射,但为它们提供不同的逻辑entity-name
和表名称。 - 然后使用
Session
方法,在其中提供entityName
作为参数,以区分彼此。
这实现了什么?
- “虚拟子类型”
- 将数据检索到类型中时,必须指定一个
entity-type
或另一个(因此暗示一个表或另一个表) - 修改数据并保存数据时,必须指定相同的
entity-type
– hibernate应拒绝使用其他entity-type
进行更新。 否则,已修改的实体已经填充了一个标识符,因此hibernate将尝试更新而不是插入,但这会在数据库中失败 – 尝试更新表中从不存在的数据。 - 这会导致隔离 – 在处理实体或实体列表时,您必须提交一个实体类型,并且不能混合这两者。 即“虚拟子类型”
费用是多少?
- 它打字非常弱。 编译器和运行时没有指示真正的子类型。 错误等待发生,调试可能很棘手。
- 这是非标准的。 JPA已经避开了这一点,我相信它并没有引起人们的关注,并且有充分的理由。
- 您必须使用XML,而不是注释。
- 您必须调用exception方法,包括“entity-type”参数。
有没有超过子类型的好处?
- 没有我能看到的
你应该这样做吗?
- 我不这么认为! 使用子类型和标准代码。
虽然我从未使用过,但在hibernate中有一个辅助表的概念。 而@SecondaryTables是hibernate中的注释,实体可以通过它来映射多个表以获取数据。 获取数据的实体应该具有@SecondaryTables注释。 它基于主键和外键并且还基于唯一约束来关联辅助表。
这是我在google上找到的一个示例,检查它是否有助于您实现:
http://www.concretepage.com/hibernate/secondarytables_hibernate_annotation.php
- 线程“main”中的exceptionorg.hibernate.MappingException:未知实体
- 将@ManyToMany关联表与额外列映射
- 无法导入org.hibernate.session
- 使用Hibernate Criteria获取具有最大ID的记录
- 使用hibernate和gilead for gwt添加到实体类中保存的列表时的LazyInitializationException
- 当在Spring / Hibernate项目中需要访问数据库时,exceptionjava.lang.NullPointerException
- JAXb,Hibernate和bean
- 如何处理复合键hibernate
- 如何unproxy一个hibernate对象