Создать спящий сборник на две колонки - PullRequest
1 голос
/ 12 мая 2009

Я пытаюсь создать приложение адресной книги с одной таблицей для людей, другой для компаний и третьей для телефонов. Таблица «Телефоны» будет содержать данные о людях и компаниях с полем, в котором указано, откуда они пришли. Предположим, что это простые таблицы:

CREATE TABLE `Person` {
  `id` int(11) NOT NULL auto_increment,
  `firstName` varchar(80) NOT NULL,
  `lastName` varchar(80) NOT NULL
}

CREATE TABLE `Company` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(80) NOT NULL
}

CREATE TABLE `ContactPhone` (
  `id` int(11) NOT NULL auto_increment,
  `contactType` char(1) NOT NULL, -- either 'P' or 'C'
  `contactId` int(11) NOT NULL, -- the id of the Person or Company
  `number` varchar(40) NOT NULL
}

Я создал соответствующие им классы Java, которые очень просты:

public class Person {
  private Integer id;
  private String firstName;
  private String lastName;
  private Collection<Phone> phones;
  // ...
}

public class Company {
  private Integer id;
  private String name;
  private Collection<Phone> phones;
  // ...
}

public class Phone {
  private Integer id;
  private String number;
  // ...
}

В простом SQL я могу очень легко получить человека и соответствующие телефоны. Мне нужно создать отображение между Person и Phone и между Company и Phone, используя обычный режим гибернации (без аннотаций), но я не могу заставить его работать. Даже не уверен, должен ли он быть однонаправленным или двунаправленным. Я искал документацию, но не нашел ничего, что могло бы помочь. Кто-нибудь?

Ответы [ 4 ]

1 голос
/ 18 мая 2009

Наконец-то мне удалось заставить это работать. То, что я искал, было элементами полиморфизма гибернации. В итоге я создал класс Contact следующим образом:

public class Contact {
  private Integer id;
  private Collection<Phone> phones;
  ...
}

и производное от него лицо и компания. С полиморфизмом Hibernate можно хранить Персона и Компанию в разных таблицах и иметь Телефон для соединения с Контактом в двух направлениях.

0 голосов
/ 20 мая 2009

Принято для моделирования это как однонаправленная ассоциация с таблицей соединений в классах Person и Company. Как именно это достигается, зависит от специфики вашей модели. Электронная документация здесь .

0 голосов
/ 12 мая 2009

Если вы спросите, как отобразить их через таблицу сопоставления в файле конфигурации, это будет выглядеть примерно так:

<bag name="Phone" table="CompanyPhoneMapping" lazy="true" cascade="all">

<key column="CompanyId" />

<one-to-many class=<insert namespace>.Phone, <insert dll> />

</bag>

Я знаком только с nhibernate, но я предполагаю, что решение java hibernate будет аналогичным.

0 голосов
/ 12 мая 2009

Этого можно добиться с помощью функции сопоставления «Фильтры» Hibernate

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...