2015-10-26 2 views
-1

У меня есть сущность, из которой я хочу иметь несколько таблиц в моей базе данных sql.Hibernate: несколько таблиц одного объекта -> inherit hibernate-mapping

Для примера, у меня есть класс 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 тоже ,

Так что я подумал, что возможно просто наследовать отображение, так что аннотации класса все еще виновны, пока я не перезаписываю его. Я попытался google и поиск в stackoverflow на эту тему, но я нашел только вещи о наследовании классов Java. Или есть другое решение, которое могло бы помочь мне в этом?

+0

вы можете использовать наследование наследования TABLE_PER_CLASS' и иметь один Ab данные сбора травм и несколько наследований – javaguest

+0

@javaguest В соответствии с этим: https://docs.jboss.org/hibernate/orm/3/reference/en/html/inheritance.html#inheritance-tableperclass Таблица для каждого класса предназначена для одного таблица для нескольких реализаций. Но я хочу, чтобы противоположные, несколько таблиц для одной реализации. Или я неправильно понял эту концепцию? – deetz

+0

OK Я думаю, я знаю, что вы сейчас имеете в виду. Используя TABLE_PER_CLASS, мне не нужно каждый раз отображать членов CollectionsData. Хорошо, я попробую это. Спасибо – deetz

ответ

0

Поскольку ваша база данных ненормирована, единственным способом достижения желаемого является создание абстрактного класса и нескольких конкретных подклассов с соответствующими кодами стран.

Если вы в состоянии изменить схему, я бы предложил добавить столбец COUNTRY_CODE VARCHAR(2) NULL в вашу таблицу SQL_ENTITY, вставить все данные из ваших 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 таблицы

+0

Но мне нужно было создать 2 подкласса для каждой таблицы, не так ли? Один для коллекции Data и один для SqlEntity. Также мне пришлось изменить в каждом подклассе SqlEntity CollectionData соответствующий тип подкласса.Я хотел бы работать с SqlEntity в проекте не с подклассами, потому что контент для каждой страны точно такой же. – deetz

+0

И да, чередование таблицы не было бы проблемой. – deetz

+0

yep, так что я думаю, лучший способ действий - нормализовать БД – javaguest

Смежные вопросы