2015-08-23 32 views
1

一個HashMap我有稱爲人的接口如下使用接口代替混凝土類映射的在休眠

public interface Person { 
    String getName();} 

我有一個抽象類,其中AbstractPerson實現人。 Abstar

@Entity 
@Inheritance(strategy=InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(name="PERSON_TYPE") 
@Table(name="PERSON") 
public class AbstractPerson implements Person{ 

@Id 
@GeneratedValue(strategy=GenerationType.AUTO) 
private Long id; 

private String firstName; 
private String lastName; 
..... 
@Override 
public String getName() { 

    return firstName + " " + lastName; 
} 

我的具體類是Member,所以它擴展了AbstractPerson。

@Entity 
@DiscriminatorValue(value="MEMBER") 
public class Member extends AbstractPerson{ 

@OneToMany(mappedBy="commentOwner") 
@MapKey(name="id") 
private Map<Long, CommentImpl> commentList; 
.... 

創建在CommentImpl的多對一關係的代碼如下

public class CommentImpl implements Comment, Serializable{ 
@ManyToOne 
private Member commentOwner; 
.... 

我的問題是我想寫對接口代替混凝土類的代碼。所以HashMap中的值類型將在Member類中爲Comment,而CommentOwner將在CommentImpl類中爲Person類型。 當我這樣做時,我得到一個未知的映射例外。我如何設置與接口和具體類的關係?

+0

您可以更新您的問題,以顯示Member'如何''實現Person'(例如,通過'AbstractPerson'實現'Person')? –

+0

感謝您的快速反饋!我還添加了AbstractPerson代碼 – baris

回答

1

one-to-many方變爲:

@OneToMany(mappedBy="commentOwner", targetEntity = "CommentImpl.class") 
@MapKey(name="id") 
private Map<Long, Comment> commentList; 

many-to-one方應該是:

@ManyToOne(targetEntity = "Member.class") 
private Person commentOwner; 
+0

感謝您的解決方案,但我有關於該解決方案的另一個問題。 說我寫另一個具體類Member2,實現Person接口。它與Comment實體具有相同的關係。那麼我將如何在CommentImpl類中引入另一個targetEntity呢? 1-我可以使用@Any註釋嗎? 2-可以將該關係移動到AbstractClass? – baris

+0

感謝您的回答,但這並不完全是我在尋找。如果我編寫另一個實現接口Person的具體類,該怎麼辦? – baris