【问题标题】:Hibernate: Several tables of one entity -> inherit hibernate-mappingHibernate:一个实体的几个表->继承hibernate-mapping
【发布时间】:2015-10-26 16:00:16
【问题描述】:

我有一个实体,我想在我的 sql 数据库中有几个表。

例如,我有一个 Java 类,其中我有另一个 Java 类的集合

@Entity
class SqlEntity{
    @Id
    @Column(unique = true)
    private Date date = null;
    @Column
    @OneToMany(fetch = FetchType.LAZY, cascade = { CascadeType.ALL, CascadeType.PERSIST,
            CascadeType.MERGE }, mappedBy = "CollectionData")
    private Collection<CollectionData> collectionData = new ArrayList<>();

    @Column(name="columNameX")
    int attributeX;
    @Column(name="columNamey")
    int attributeY;
    ...
}

我希望根据数据的来源在不同的表中使用不同的数据: SQL_ENTITY_GERMANY, SQL_ENTITY_USA, SQL_ENTITY_UK, ...

我能够通过为每个表编写一个xml-mapping 来实现这一点(在此之前我只有 java 注释来映射实体)。 但是我必须为每个表编写一个完整的映射,如下所示:

<hibernate-mapping>
    <class name="...SqlEntity" table="SQL_ENTITY_GERMANY"
        entity-name="SQL_ENTITY_GERMANY">

        <id name="date" type="date" column="date">
        </id>

        <property name="columnNameX" column="attributeX" type="int" />
        <property name="columnNameY" column="attributeY" type="int" />
        ...

        <bag name="collectionData" cascade="all">
            <key column="date" />
            <one-to-many class="COLLECTION_DATA_GERMANY" />
        </bag>
    </class>

    <class name="...collectionData" table="COLLECTION_DATA_GERMANY"
        entity-name="COLLECTION_DATA_GERMANY">

        <id name="id" type="long" column="id">
            <generator class="native" />
        </id>

        <property name="columnNameX" column="attributeX" type="int" />
        <property name="columnNameY" column="attributeY" type="int" />
        ...
        <many-to-one name="collectionData" class="SQL_ENTITY_GERMANY"
            fetch="select">
            <column name="date" not-null="true" />
        </many-to-one>
    </class>
</hibernate-mapping>

因此,如果我想更改一个实体类中的任何内容(例如添加成员),我也必须在每个 xml-mapping 中更改它。

所以我认为也许可以只继承映射,这样只要我不覆盖它,类的注释仍然是有罪的。 我试图用谷歌搜索这个主题的stackoverflow,但我只找到了关于java类继承的东西。 还是有其他解决方案可以帮助我解决这个问题?

【问题讨论】:

  • 你可以使用TABLE_PER_CLASS继承映射,拥有一个抽象集合数据和多个继承
  • @javaguest 据此:docs.jboss.org/hibernate/orm/3.5/reference/en/html/… 每个类的表用于为多个实现提供一个表。但我想要一个实现的相反的几个表。还是我误解了这个概念?
  • 好的,我想我现在明白你的意思了。通过使用 TABLE_PER_CLASS,我不必每次都映射 CollectionsData 的成员。好的,我会试试的。谢谢
  • 使用 TABLE_PER_CLASS 我必须为每个表创建一个类,我想避免这种情况!我认为这对我没有帮助!
  • 好吧,我一直在寻找,但是您的数据库未标准化这一事实使其变得困难。你有 DBA 访问权限吗?你能改变你的 sql_entity 吗?

标签: java xml hibernate


【解决方案1】:

由于您的数据库是非规范化的,实现您想要的唯一方法是创建一个抽象类和几个具有适当国家代码的具体子类。

如果您能够更改架构,我建议在您的 SQL_ENTITY 表中添加一个列 COUNTRY_CODE VARCHAR(2) NULL,插入您的 SQL_ENTITY_* 表中的所有数据。

您可以这样做:

1)创建一个新的SQL_ENTITY

CREATE TABLE NEW_SQL_ENTITY (
id_entity INTEGER NOT NULL AUTO_INCREMENT;
value1 VARCHAR(100) NOT NULL;
value2 VARCHAR(100) NOT NULL;
country_code VARCHAR(2) NULL;
)

2) 插入其他表中的数据:

INSERT INTO NEW_SQL_ENTITY (value1,value2,country_code) VALUES
(SELECT value1,value2, 'UK' from SQL_ENTITY_UK)

3) 对所有 SQL_ENTITY 表重复

【讨论】:

  • 但是我必须为每个表创建 2 个子类,对吗?一个用于collectionData,一个用于SqlEntity。此外,我必须在 SqlEntity 的每个子类中将 CollectionData 更改为相应的子类类型。我想使用项目中的 SqlEntity 而不是子类,因为每个国家/地区的内容完全相同。
  • 是的,更换桌子不会有问题。
  • 是的,所以我想最好的做法是规范化数据库
猜你喜欢
  • 2016-11-27
  • 1970-01-01
  • 2021-06-11
  • 1970-01-01
  • 2012-03-06
  • 2015-08-13
  • 2014-05-08
  • 2021-02-21
  • 2015-10-09
相关资源
最近更新 更多