2011-12-29 33 views
2

我有一個令人沮喪的映射問題,肯定需要一些眼球。 我有一個抽象類,具有單個表的繼承策略的子類。 它擁有一個聯繫人,並且需要也是具有相同繼承策略的抽象類。 這裏是我的代碼:OneToOne映射不適用於抽象子類

@Entity 
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(name = "discriminator", discriminatorType = DiscriminatorType.STRING) 
@Table(name = "leads") 
@Cache(region = "com.qe.model.Lead", usage = CacheConcurrencyStrategy.READ_WRITE) 
public abstract class Lead { 
    private Long id; 
    protected Contact contact; 


    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "id") 
    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    @OneToOne(cascade = CascadeType.ALL, mappedBy = "lead") 
    public Contact getContact() { 
     return contact; 
    } 

    public void setContact(Contact contact) { 
     this.contact = contact; 
    } 

} 


@Entity 
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(name = "discriminator", discriminatorType = DiscriminatorType.STRING) 
@Table(name = "contacts") 
@Cache(region = "com.qe.model.Contact", usage = CacheConcurrencyStrategy.READ_WRITE) 
public abstract class Contact { 

    private Long id; 
    private Lead lead; 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "id") 
    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    @OneToOne 
    @JoinColumn(name = "lead_id") 
    public Lead getLead() { 
     return lead; 
    } 

    public void setLead(Lead lead) { 
     this.lead = lead; 
    } 
} 
@Entity 
@DiscriminatorValue("AUTO") 
public class AutoContact extends Contact { 
} 

我得到的錯誤:

無法確定類型:com.qe.model.AutoContact,在表: 線索,爲列:[組織.hibernate.mapping.Column(接觸)

任何想法,將不勝感激......

回答

0

這實際上是我的錯。在AutoContact上有一個幫手方法(未示出),這是一個覆蓋 public contact getContact()

這是搞亂了映射。 感謝您的幫助@tscho

0

對不起,其實你的映射外觀對我來說完全合適。該錯誤信息令我困惑,因爲leads表中不應該有contact列。您的映射定義contacts表中的外鍵列。 Hibernate也支持多態的一對一關聯。

您可以嘗試將targetEntity參數添加到Contact的類Lead的映射中(儘管我懷疑這會有所幫助)。

@OneToOne(cascade = CascadeType.ALL, mappedBy = "lead", targetEntity = Contact.class) 
public Contact getContact() { 
    return contact; 
} 

你也可以嘗試刪除從Contactabstract修飾符(儘管這可能不是你想要做什麼)。

希望有所幫助。