我正在尝试使用PersonCompany来创建一个简单的联系人应用程序,该应用程序来自名为Atom的基类:

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


我想在上面添加ContactPhoneContactEmail。我要执行的棘手操作是合并两个人,并自动合并其对应的电子邮件和电话。假设我们将这两个人称为赢家和宽松者,我希望进行以下更新:

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


更进一步,我希望ContactPhoneContactEmail以及其他一些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 {
    ...
}


关键部分是当我合并ContactPhoneContactEmail时。

接口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 {
...
}

最佳答案

我会用类似的代码来实现

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();
}

10-06 03:29