2012-01-22 63 views
16

我應該首先說我對Java EE相當陌生,並且我還沒有很強的Java理論背景。如何使用接口和JPA

我無法理解如何在Java中使用JPAinterfaces。爲了說明我發現的難點,我創建了一個非常簡單的例子。

如果我有兩個簡單的接口PersonPet

public interface Person 
{ 
    public Pet getPet(); 
    public void setPet(Pet pet); 
} 

public interface Pet 
{ 
    public String getName(); 
} 

和實現Person實體PersonEntity以及它實現Pet一個PetEntity

@Entity 
public class PersonEntity implements Person 
{ 
    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private Long id; 

    private PetEntity pet; 

    @Override 
    public void setPet(Pet pet) 
    { 
     /* How do i solve this? */ 
    } 
} 

@Entity 
public class PetEntity implements Pet 
{ 
    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private Long id; 

    private String name; 

    /* Getters and Setters omitted */ 

} 

如何妥善處理在我想要堅持上面兩個實體之間的關係的setPet方法中的情況?

我想使用接口的主要原因是因爲我想保持模塊/圖層之間的依賴關係到公共接口。還有什麼我可以避免從例如我的ManagedBean直接到實體?

如果有人建議不要在實體上使用接口,那麼請解釋有哪些替代方法或模式。

回答

17

您可以在關係註釋中使用targetEntity屬性。

@Entity 
public class PersonEntity implements Person { 
    private Long id; 

    private Pet pet; 

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

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

    @Override 
    @OneToOne(targetEntity = PetEntity.class) 
    public Pet getPet() { 
     return pet; 
    }   

    public void setPet(Pet pet) { 
     this.pet = pet; 
    } 
} 
+1

你確定它能正常工作嗎?您正在使用隱式字段訪問,但在setter上設置了「@ OneToOne」註釋。此外,即使有財產訪問,這個註釋是否會起作用?它不應該是吸氣劑而是吸氣劑嗎? –

+1

Mairbek,那混合領域不動產訪問?您是否認爲JPA 2.0規範的這一部分在這種情況下是相關的:*「在明確指定Access註釋的情況下,將註釋放置在實體層次結構中的字段和屬性上的應用程序的行爲是未定義的。 –

+1

工作只要有1人執行就行了。當你有超過1的話,你需要在接口字段的實現中得到明確的支持 – user383680