2011-07-24 13 views
29

Mam dwie klasy. Jednym z nich jest klasa encji, a druga służy jako złożona klasa kluczy.Brak domyślnego konstruktora dla obiektu dla klasy wewnętrznej w Hibernate

Kod jest następujący.

@Entity 
public class Supply { 

    @Embeddable 
    class Id implements Serializable { 

     @Column(name = "supplier_id") 
     private long supplierId; 
     @Column(name = "merchandise_id") 
     private long merchandiseId; 

     public Id() { 
     } 

     public Id(long sId, long mId) { 
      this.supplierId = sId; 
      this.merchandiseId = mId; 
     } 
    } 

    @EmbeddedId 
    private Id id = new Id(); 
} 

Jeśli używam spróbować znaleźć

from Supply where merchandise_id=%d and supplier_id=%d 

Hibernate rzuci wyjątek, a mianowicie:

No default constructor for entity: com.entity.Supply$Id; nested exception is org.hibernate.InstantiationException: No default constructor for entity: com.entity.Supply$Id 

Uważam jednak, że jeśli zmienię klasyId do static. Wszystko będzie dobrze.

Jestem ciekawy, jak te wszystkie rzeczy mogą się wydarzyć.

+0

Bardzo by to pomogło, gdybyś w tym poście umieścił identyfikator ostrzeżenia o hibernacji "HHH000182". Statyczna rzecz naprawiła dla mnie, ale znalezienie tej odpowiedzi było trudne! – Amalgovinus

Odpowiedz

41

Jeśli klasa nie jest static, wymaga instancji zewnętrznej klasy w celu instancja - więc nie będzie domyślnym konstruktor. Trzeba by użyć składni podobnej do:

new Supply().new Id(); 

Jeśli klasa Id jest static, można po prostu zadzwonić:

new Id(); 
0

Jeśli klasa nie jest statyczna, będzie wymagać wystąpienia instancji klasy zewnętrznej. Myślę więc, że wygenerowany konstruktor w tym przypadku będzie miał domyślny parametr dla klasy zewnętrznej.


Aktualizacja

jak się spodziewałem:

$ javap -classpath . Supply\$Id 
Compiled from "Supply.java" 
class Supply$Id extends java.lang.Object{ 
    final Supply this$0; 
    Supply$Id(Supply); 
} 
8

zawsze dodać pustą chroniony konstruktor do klasy, aby rozwiązać ten problem tak:

protected Classname(){} 

w Twoim przypadku będzie to wyglądać tak:

protected Id(){} 
Powiązane problemy