2009-05-12 2 views
1

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

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 and Phone и между компанией и телефоном, используя простой спящий режим (без аннотаций), но не может заставить его работать. Даже не уверен, что он должен быть однонаправленным или двунаправленным. Я искал документацию, но не нашел ничего, что могло бы помочь. Кто угодно?

+0

Какова связь между Компанией и телефоном? – Cherian

+0

Компания может иметь коллекцию телефонов в одностороннем порядке. Нет связи «назад» от телефонов к компаниям. – rmarimon

ответ

0

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

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

<key column="CompanyId" />

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

</bag>

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

0

Вы могли бы добиться этого с помощью "Filters" mapping feature из Hibernate

+0

Похоже, что это будет работать при загрузке объекта, но как насчет того, когда вы сохраняете объект? Как правильно ввести значение в контактный тип таблицы ContactPhone? – rmarimon

1

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

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

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

+0

Это один из способов сделать это. См. Мой пост по-другому. –

0

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

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