每个实体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_tableuser1users_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