有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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配置


共 (5) 个答案

  1. # 1 楼答案

    它还可以使用默认实体和备选实体:

    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
       <class name="DomainModel.User, DomainModel"
         table="User1Object">  
             <id name="_id" access="field" column="id">
                 <generator class="assigned"/>
             </id>
            <property name= ...>
     </class>
     <class name="DomainModel.User, DomainModel"
         table="User2Object" entity-name="User2Object">
             <id name="_id" access="field" column="id">
                <generator class="assigned"/>
             </id>
            <property name= ...>
    </class>
    </hibernate-mapping>
    

    对于默认的方法,可以使用

    _session.Save(user1)
    

    _session.Save("User2Object", user2)
    

    换一个

  2. # 2 楼答案

    前言:

    即使如此,这也是一个被广泛询问的问题,而且答案也广泛地与Subclass或实际上SuperClass方法有关(例如,.[1])

    实际答案:

    在这些帖子[2],3]上,他们建议使用带有EntityName参数的xml映射

    因此,使用xml映射不需要超类,只需将EntityName参数指定给两个相同的映射即可

    映射示例:

    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
       <class name="DomainModel.User, DomainModel"
         table="User1Object" entity-name="User1Object">  
             <id name="_id" access="field" column="id">
                 <generator class="assigned"/>
             </id>
            <property name= ...>
     </class>
     <class name="DomainModel.User, DomainModel"
         table="User2Object" entity-name="User2Object">
             <id name="_id" access="field" column="id">
                <generator class="assigned"/>
             </id>
            <property name= ...>
    </class>
    </hibernate-mapping>
    

    然后,根据您需要的实体类型,调用相应的会话方法,如下所示:

    _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. # 3 楼答案

    我知道这个问题很久以前就被问过了。但是我想建议一种替代方法,不使用任何hibernate的东西。对于那些不想使用xml配置的人

    用common列的getter和setter方法声明一个接口,然后让您的两个实体类实现这个接口。 保持这两个实体类中的映射注释不变,然后在代码中,您可以调用此接口的方法

  4. # 4 楼答案

    您可以使用以下配置执行此操作:

    • 为同一实体类创建两个映射,但为它们指定不同的逻辑名称
    • 然后使用Session方法,其中提供entityName作为一个参数,以区分两者

    这能实现什么

    • “虚拟子类型”
    • 将数据检索到类型中时,必须指定一个entity-type或另一个(因此意味着一个表或另一个表)
    • 修改并保存数据时,必须指定相同的entity-type-hibernate应拒绝尝试使用不同的entity-type进行更新。否则,修改后的实体将已填充标识符,因此hibernate将尝试更新而不是插入,但这将在数据库中失败-尝试更新表中从未存在的数据
    • 这会导致隔离—在处理实体或实体列表时,必须使用一种实体类型,并且不能混合使用这两种类型。i、 e.“虚拟分型”

    成本是多少

    • 它的打字能力很弱。编译器和运行时没有指示真正的子类型。错误正在等待发生,调试起来可能很棘手
    • 这是不标准的。JPA已经避开了这一点,我相信它没有被列入雷达,而且是有充分理由的
    • 您必须使用XML,而不是注释
    • 必须调用异常方法,包括“entity type”参数

    子类型是否有好处

    • 我看不见

    你应该这样做吗

    • 我不这么认为!使用子类型和标准代码
  5. # 5 楼答案

    虽然我从未使用过,但在hibernate中有一个辅助表的概念。@SecondaryTables是hibernate中的注释,通过它,实体可以映射多个表以获取数据。正在获取数据的实体应具有@SecondaryTables注释。它根据主键和外键以及唯一约束关联辅助表

    以下是我在使用谷歌后发现的一个示例,请检查它是否有助于您实现:

    http://www.concretepage.com/hibernate/secondarytables_hibernate_annotation.php