2012-01-22 18 views
16

Java EE için oldukça yeni olduğumu ve Java'da henüz güçlü bir teorik arka plana sahip olmadığımı söyleyerek işe koyulmalıyım.Arabirimler ve JPA ile çalışma nasıl yapılır

JPA'un Java'da interfaces ile birlikte nasıl kullanıldığını anlamakta zorlanıyorum. Zor bulduğumu göstermek için çok basit bir örnek oluşturdum.

Ben iki basit arayüzleri Person ve Pet varsa: Ben düzgün işlemek nasıl

@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 */ 

} 

:

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

public interface Pet 
{ 
    public String getName(); 
} 

Ve Person uygulayan bir Varlık PersonEntity yanı sıra Pet uygulayan bir PetEntity Yukarıdaki iki varlık arasındaki ilişkileri devam ettirmek istediğim setPet yönteminde durum nedir?

Arabirimleri kullanmak istememin temel nedeni, modüller/katmanlar arasındaki bağımlılıkları ortak arabirimlere tutmak istememdir. Başka bir şekilde, örneğin ManagedBean'ım doğrudan bir varlığa mı?

Birisi, varlıklar üzerindeki arabirimleri kullanmamaya karşı önerirse, lütfen hangi yöntem veya desenlerin var olduğunu açıklayın.

cevap

17

İlişkilendirmenin ek açıklamada targetEntity özelliğini kullanabilirsiniz.

@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

Çalışacağından emin misiniz? Kapalı alan erişimi kullanıyorsunuz, ancak sette "@ OneToOne" açıklamasını ayarlıyorsunuz. Dahası, mülk erişimi ile bile, bu açıklama işe yarayacak mı? Setter yerine getterde olmamalı mı? –

+1

Mairbek, ve ne tür bir alana erişim sağlama konusunda? Bu durumda JPA 2.0 özelliklerinin bu bölümünün alakalı olduğunu düşünüyor musunuz: * "Açıklamanın ek açıklamasını belirtmeden, bir açıklama hiyerarşisi içindeki alanların ve özelliklerin ek açıklamaların yerleşimini karıştıran uygulamaların davranışı tanımsızdır." *? –

+1

Tabii ki sadece 1 kişinin uygulaması olduğu sürece çalışır. 1'den fazla zamanınız olduğunda, arayüz alanları için uygulamada açık desteğe ihtiyacınız olacaktır. – user383680

İlgili konular