2009-05-12 4 views
3

Я пытаюсь сопоставить некоторые существующие таблицы с Hibernate.Hibernate: отображение 3 таблиц

Это довольно просто: у нас есть категории с именами на нескольких языках.

DDL выглядит следующим образом:

create table language (
    id    integer not null auto_increment, 
    code    varchar(2) not null, 

    unique (code), 

    primary key(id) 
); 

create table category (
    id    integer not null auto_increment, 
    parent_id  integer default null, 
    ordr    integer not null default 99, 

    primary key (id) 
); 

create table category_description (
    category_id  integer not null, 
    language_id  integer not null, 

    title   varchar(255) not null, 

    constraint foreign key (category_id) references category(id), 
    constraint foreign key (country_language_id) references country_language(id), 

    primary key (category_id, country_language_id) 
); 

Теперь я хотел бы иметь карту с языка, как это ключ и описание (таблица category_description), как это значение, например:

private Map<Language, CategoryDescription> descriptions = new HashMap<Language, CategoryDescription>(); 

Может ли кто-нибудь предоставить мне некоторые указатели на это? Я пробовал пример, приведенный на странице 311/312, из «Java Persistence with Hibernate», который похож на мою проблему, но я просто не получаю его :(

ответ

2

(Ваш DDL несовместим, вы создаете таблицу " язык», но ссылаться на таблицу„country_language“- я буду считать, последний)

Вот что отображение Hibernate для образца будет выглядеть так:

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping default-lazy="false"> 

    <class name="Language" table="country_language"> 
     <id name="id" type="int"> 
      <column name="ID" /> 
      <generator class="native" /> 
     </id> 
     <property name="code" type="string" length="2" unique="true" /> 
    </class> 

    <class name="Category" table="category"> 
     <id name="id" type="int"> 
      <column name="ID" /> 
      <generator class="native" /> 
     </id> 
     <map name="descriptions" table="category_description"> 
      <key column="category_id" /> 
      <map-key-many-to-many column="language_id" class="Language" /> 
      <composite-element class="CategoryDescription"> 
       <property name="title" type="string" length="255" /> 
      </composite-element> 
     </map> 
    </class> 

</hibernate-mapping> 

Однако, вам не нужен CategoryDescription класса (поскольку он просто обертывает String):

private Map<Language, String> descriptions; 

и

<map name="descriptions" table="category_description"> 
    <key column="category_id" /> 
    <map-key-many-to-many column="language_id" class="Language" /> 
    <element type="string" length="255" column="title" /> 
</map> 

будет работать так же хорошо.

Обратите внимание, что в обоих случаях ваш Language класс должен переопределить hashCode() и equals() для того, чтобы иметь возможность успешно запросить полученную карту:

/* eclipse generated */ 
@Override 
public int hashCode() { 
    final int prime = 31; 
    int result = 1; 
    result = prime * result + ((id == null) ? 0 : id.hashCode()); 
    return result; 
} 

/* eclipse generated */ 
@Override 
public boolean equals(Object obj) { 
    if (this == obj) 
     return true; 
    if (obj == null) 
     return false; 
    if (getClass() != obj.getClass()) 
     return false; 
    Language other = (Language) obj; 
    if (id == null) { 
     if (other.id != null) 
      return false; 
    } else if (!id.equals(other.id)) 
     return false; 
    return true; 
} 
+0

Привет, Большое спасибо за ответ. Мы работали вокруг этого так, как мне не нравится, но я обязательно попробую это. Вы правы относительно несоответствия DDL; Я попытался немного «упростить» вещи, но, очевидно, что-то пропустил. В этом отношении категория CategoryDescription также была упрощена, она имеет еще несколько атрибутов. У нас есть одна и та же установка из трех таблиц для других объектов (многие из наших сущностей имеют многоязычные описания, которые разработаны аналогичным образом. Я отправлю сообщение, как только найду время, чтобы попробовать ваше решение. Спасибо. – user90209