我正在尝试使用Person
和Company
来创建一个简单的联系人应用程序,该应用程序来自名为Atom
的基类:
Atom
+-Contact
+-Person
+-Company
+-ContactPhone
+-ContactEmail
我想在上面添加
ContactPhone
和ContactEmail
。我要执行的棘手操作是合并两个人,并自动合并其对应的电子邮件和电话。假设我们将这两个人称为赢家和宽松者,我希望进行以下更新: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
时。接口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();
}