Как правильно моделировать сложную иерархию и интерфейс с Hibernate - PullRequest
1 голос
/ 24 января 2012

Я пытаюсь настроить простое приложение для контактов с Person и Company, полученными из базового класса с именем Atom:

Atom
  +-Contact
      +-Person
      +-Company
  +-ContactPhone
  +-ContactEmail

Я хочу добавить ContactPhone и ContactEmail к вышесказанному. Операция tricky , которую я хочу сделать, - объединить два человека и автоматически объединить их соответствующие электронные письма и телефоны. Допустим, мы называем этих двух человек победителем и проигравшим, я собираюсь сделать следующее обновление:

update ContactPhone CP set CP.contact_id=winnerid where CP.contact_id=looserid
update ContactEmail CE set CE.contact_id=winnerid where CE.contact_id=looserid

Более того, я бы хотел, чтобы ContactPhone, ContactEmail и, возможно, какой-то другой ClassConnectedToAContact реализовали интерфейс ConnectedToContact и сделали следующий запрос:

update ConnectedToContact CTC set CTC.contact_id=winnerid where CTC.contact_id=looserid

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

класс Атом

Предоставляет уникальный идентификатор для всех элементов базы данных. А также создание, обновление, удаление, статус для всех объектов

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class Atom {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
...
}

класс Контакт

@MappedSuperclass
public abstract class Contact extends Atom {
    public abstract Collection<ContactPhone> getPhones();
    public abstract void setPhones(Collection<ContactPhone> phones);
    public abstract Collection<ContactEmail> getEmails();
    public abstract void setEmails(Collection<ContactEmail> emails);
    ...
}

класс персонажа

Хранится в собственной таблице.

@Entity
public class Person extends Contact {
    ...
}

класс Фирма

Хранится в собственной таблице.

@Entity
public class Company extends Contact {
    ...
}

Важнейшая часть - это когда я включаю ContactPhone и ContactEmail, которые ContactConnected.

интерфейс ConnectedToContact

@MappedSuperclass
public interface ConnectedToContact {
    public Contact getContact();
    public void setContact(Contact contact);
}

класс ContactPhone

@Entity
public class ContactPhone extends Atom implements ConnectedToContact {
...
}

класс ContactEmail

@Entity
public class ContactEmail extends Atom implements ConnectedToContact {
...
}

1 Ответ

0 голосов
/ 24 января 2012

я бы реализовал это в коде что-то вроде

public void Merge(Contact contact1, Contact contact2)
{
    session.beginTransaction();
    Contact winner = null;
    Contact loser = null;
    // determine winner and loser

    // Hibernate should know which entities implements ConnectedToContact
    List<ConnectedToContact> loserData = session.createCriteria(ConnectedToContact.class)
        .add(Restrictions.eq("Contact.Id", loser.getId()))
        .list();

    for(ConnectedToContact item : loserData)
    {
        item.setContact(winner);
    }
    session.getTransaction().commit();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...