2012-01-24 78 views
1

我試圖建立與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); 
    ... 
} 

類Person

在自己的表存儲。

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

類公司

存儲在自己的表。

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

的關鍵部分是,當我結合是ContactConnectedContactPhoneContactEmail

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

解決這個代碼真的太慢了​​嗎? – Firo

+0

這不是關於緩慢。在某些時候,會有很多'ConnectedToContact'實體。試圖更新大量開發人員的所有關係可能會導致錯誤。特別是當新實體被納入時。我只是試圖保護自己... ;-) – rmarimon

回答

0

我會在代碼中實現它像

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

這正是我使用的代碼的類型。問題是查詢由於某種原因返回null。我認爲這與我聲明'@ Entity'和'@ MappedSuperclass'的方式有關。 – rmarimon

+0

那麼最好解決這個問題 – Firo