java休眠每个实体两个表
我有一个实体-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")
结果我应该在{
由于系统限制,我无法将这两个对象放在一个表中。(即使创建额外的字段也是个坏主意)
我可以不使用子类来完成这项工作吗?使用programmaticaly hibernate配置
# 1 楼答案
它还可以使用默认实体和备选实体:
对于默认的方法,可以使用
及
换一个
# 2 楼答案
前言:
即使如此,这也是一个被广泛询问的问题,而且答案也广泛地与
Subclass
或实际上SuperClass
方法有关(例如,.[1])实际答案:
在这些帖子[2],3]上,他们建议使用带有
EntityName
参数的xml映射因此,使用xml映射不需要超类,只需将
EntityName
参数指定给两个相同的映射即可映射示例:
然后,根据您需要的实体类型,调用相应的会话方法,如下所示:
_session.Save("User1Object", user1)
或
_session.Save("User2Object", user2)
职位2&;3作为这个片段的基础。官方来源[4]
赛后:
关于第一个问题的一个答案实际上是链接到这篇文章[5]有不同的方法:
对对象的第一个实例说再见,将数据克隆到新实例,并使用不同的名称保存该实例。因此,不会违反Hibernate逻辑和Everyone内容:两个表中的数据相同,并且没有使用子类
好吧,这种方法的实现、代码或可信度都是如此,我也没有测试过
另一种情况:
在这篇文章[6]中,有另一个人试图用更简单的方法挑战超类方法,但最可信的答案再次指出,不可能用另一种方法来解决,官方的非xml方法是上述子类方法
来源
[1]How to map one class to different tables using hibernate/jpa annotations
[2]Map Two Identical tables ( same schema...) to same entity in Hibernate
[3]How to map 2 identical tables (same properties) to 1 entity
[4]http://docs.jboss.org/hibernate/core/3.2/reference/en/html/mapping.html#mapping-entityname
[5]Hibernate 4: One class mapping Two tables - How to persist one object on both tables?
[6]Hibernate Annotation for Entity existing in more than 1 catalog
# 3 楼答案
我知道这个问题很久以前就被问过了。但是我想建议一种替代方法,不使用任何hibernate的东西。对于那些不想使用xml配置的人
用common列的getter和setter方法声明一个接口,然后让您的两个实体类实现这个接口。 保持这两个实体类中的映射注释不变,然后在代码中,您可以调用此接口的方法
# 4 楼答案
您可以使用以下配置执行此操作:
Session
方法,其中提供entityName
作为一个参数,以区分两者李>这能实现什么强>
entity-type
或另一个(因此意味着一个表或另一个表)entity-type
-hibernate应拒绝尝试使用不同的entity-type
进行更新。否则,修改后的实体将已填充标识符,因此hibernate将尝试更新而不是插入,但这将在数据库中失败-尝试更新表中从未存在的数据李>成本是多少强>
子类型是否有好处强>
你应该这样做吗强>
# 5 楼答案
虽然我从未使用过,但在hibernate中有一个辅助表的概念。@SecondaryTables是hibernate中的注释,通过它,实体可以映射多个表以获取数据。正在获取数据的实体应具有@SecondaryTables注释。它根据主键和外键以及唯一约束关联辅助表
以下是我在使用谷歌后发现的一个示例,请检查它是否有助于您实现:
http://www.concretepage.com/hibernate/secondarytables_hibernate_annotation.php