2011-07-24 23 views
29

İç sınıf için varlık için varsayılan kurucu yok İki sınıfım var. Biri varlık sınıfı, diğeri ise bileşik bir anahtar sınıfı olarak işlev görür.Hazırda Bekletme durumu

Kod takip ediyor.

@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(); 
} 

ı bulmak için deneyin kullanırsanız

from Supply where merchandise_id=%d and supplier_id=%d 
hazırda yani bir istisna, atacağım

: Ben hiç sınıfkimliği değiştirirseniz bulundu, ancak

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

statik. Herşey iyi olacak.

Tüm bu şeylerin nasıl olabileceğini merak ediyorum.

+0

Bu gönderideki hazırda bekleme kimliği "HHH000182" yi eklediyseniz çok yardımcı olacaktır. Benim için statik şey sabit şeydi, ama bu cevabı bulmak zordu! – Amalgovinus

cevap

41

, bu örneği için dış sınıfının bir örneğini gerektirir - bu yüzden varsayılan olacak yapıcı. Sen benzer bir sözdizimi kullanmak zorunda: Id sınıf static ise

new Supply().new Id(); 

, sadece çağırabilirsiniz:

new Id(); 
0

Sınıf statik değilse, dış sınıf örneğinin bulunması gerekir. Bu yüzden, bu durumda oluşturulan kurucunun dış sınıf için örtük bir parametresi olacağını düşünüyorum.


Güncelleme

beklediğim gibi: sınıf static değil

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

Her zaman bu sorunu çözmek için sınıfa boş korumalı kurucu ekleyin şöyle: senin durumunda

protected Classname(){} 

bu şekilde görünecektir:

protected Id(){} 
İlgili konular