2009-07-01 10 views
7

Mamy zestaw interfejsów, używany jako interfejs API i do którego można się odwoływać z innych modułów. Zestaw konkretnych implementacji tych interfejsów, prywatny do "głównego" modułu aplikacji. Te klasy zawierają wiele adnotacji (JPA oraz serializacja XStream dla XML).Hibernate i JPA - mapowanie błędów Klasa osadzona udostępniona przez interfejs

Wystąpił problem. Mamy klasę użytkownika, która zawiera wiele pól związanych z lokalizacją. Chcielibyśmy zamienić je w klasę adresu. Chcemy, aby dane (na razie) pozostały w tej samej tabeli. Podejście to klasa osadzona.

Problem polega na tym, że sygnatury typów muszą odnosić się tylko do innych interfejsów w celu spełnienia implementowanych przez nie interfejsów.

Kiedy próbuję utrzymują się UserImpl, otrzymuję wyjątek:

org.hibernate.MappingException: Nie można określić typ dla : com.example.Address, w tabeli: dla użytkownika, kolumny: [org.hibernate.mapping.Column (adresu)]

Przykład Kod:

interface User { 
    int getId(); 
    String getName(); 
    Address getAddress(); 
} 

@Entity 
class UserImpl implements User { 
    int id; 
    String name; 
    Address address; 

    int getId() { 
     return id; 
    } 

    void setId(int id) { 
     this.id = id; 
    } 

    String getName() { 
     return name; 
    } 

    String setName(String name) { 
     this.name = name; 
    } 

    @Embedded 
    Address getAddress() { 
     return address; 
    } 

    void setAddress(Address address) { 
     this.address = address; 
    } 
} 


interface Address { 
    String getStreet(); 
    String getCity(); 
    String getState(); 
    String getZip(); 
    String getCountry(); 
} 

@Embeddable 
class AddressImpl implements Address { 
    String street; 
    String city; 
    String state; 
    String zip; 
    String country; 

    public String getStreet() { 
     return street; 
    } 

    public String getCity() { 
     return city; 
    } 

    public String getState() { 
     return state; 
    } 

    //... etc 
} 

Odpowiedz

13

Można użyć @Target hibernacji adnotacji (co jest Hibernate specyficzne rozszerzenie adnotacji WZP)

@Embedded 
@Target(AddressImpl.class) 
Address getAddress() { 
    return address; 
} 
+0

Dzięki, że to rzeczywiście rozwiązanie chociaż ja ufałem to może być wykonane przy użyciu tylko JPA. Może pomóc dowiedzieć się, czy jest to możliwe w przypadku innych implementacji JPA. –

+0

Na podstawie wspomnianego wyjątku założyłem, że korzystasz z Hibernacji. Szanse są, jeśli jest częścią Hibernate Adnotations, nie została jeszcze dodana do specyfikacji JPA. – mtpettyp

+1

Jesteśmy, ale byłoby miło być neutralnym dla sprzedawcy, jeśli to możliwe. –

Powiązane problemy