2016-03-24 8 views
1

次の2つのインターフェイスを実装し、JPAとHibernateを使用してデータベースにマップします。JPA:インターフェイスで@Embeddableと@EmbeddedIdを使用する

public interface IThing { 
    public IKey getId(); 
    public void setId(IKey id); 
} 

public interface IKey { 
    public String getS(); 
    public void setS(String s); 
    public Boolean getB(); 
    public void setB(Boolean b); 
} 

したがって、Keyは2つのフィールドを持つオブジェクトである必要があります。彼らの名前と種類は関係ありません。重要なことは、KeyThingの複合キーであることです。

シンプル(または任意のJavaコードのための単純な考えられている)の実装:

@Entity 
public class Thing implements IThing, java.io.Serializable { 
    @EmbeddedId 
    private IKey id; 

    public IKey getId() { 
     return this.id; 
    } 
    public void setId(IKey id) { 
     this.id = id; 
    } 
} 

@Embeddable 
public class Key implements IKey, java.io.Serializable { 
    private String s; 
    private Boolean b; 

    public String getS() { 
     return s; 
    } 
    public void setS(String s) { 
     this.s = s; 
    } 

    public Boolean getB() { 
     return b; 
    } 
    public void setB(Boolean b) { 
     this.b = b; 
    } 
} 

、あなたも、それらを使用する必要はありません、彼らの単なる存在とのEntityManagerの作成はに十分であるように見えますこれをトリガー:

java.lang.reflect.InvocationTargetException 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at org.codehaus.mojo.exec.ExecJavaMojo$1.run(ExecJavaMojo.java:293) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: example] Unable to configure EntityManagerFactory 
    at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:378) 
    at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:56) 
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:79) 
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:54) 
    at example.Main.main(Main.java:7) 
    ... 6 more 
Caused by: org.hibernate.AnnotationException: example.IKey has no persistent id property: example.Thing.id 
    at org.hibernate.cfg.AnnotationBinder.bindComponent(AnnotationBinder.java:2301) 
    at org.hibernate.cfg.AnnotationBinder.processElementAnnotations(AnnotationBinder.java:2021) 
    at org.hibernate.cfg.AnnotationBinder.processIdPropertiesIfNotAlready(AnnotationBinder.java:796) 
    at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:707) 
    at org.hibernate.cfg.Configuration$MetadataSourceQueue.processAnnotatedClassesQueue(Configuration.java:4035) 
    at org.hibernate.cfg.Configuration$MetadataSourceQueue.processMetadata(Configuration.java:3989) 
    at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1398) 
    at org.hibernate.cfg.Configuration.buildMappings(Configuration.java:1375) 
    at org.hibernate.ejb.Ejb3Configuration.buildMappings(Ejb3Configuration.java:1519) 
    at org.hibernate.ejb.EventListenerConfigurator.configure(EventListenerConfigurator.java:193) 
    at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:1100) 
    at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:282) 
    at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:366) 
    ... 10 more 

私はこれを使用することができますが、エラーなしで(それがIThingを実装し、IKeyインターフェースを無視していないか注意してください)

@Entity 
public class Thing2 implements java.io.Serializable { 
    @EmbeddedId 
    private Key id; 

    public Key getId() { 
     return this.id; 
    } 
    public void setId(Key id) { 
     this.id = id; 
    } 
} 

インタフェースを使用してバージョンを作成する方法が見つかりませんでした。 2つのインタフェースを実装し、結果の実装クラスを適切なJPA @Entity@EmbeddedIdにすることは可能ですか?

(これはthis other questionに関連するかもしれない、少なくともエラーが同様である。)

+1

にHibernateのようなインタフェースをサポートして考えてはいけない助けることができることを願って、あなたは、使用されている実装を指定するには、注釈の「targetEntity」を指定する必要がありますので、おそらくあなたはそれを行うべきです。私が使っている実装(DataNucleus)はJPAベンダー拡張としてのインターフェースをサポートしていますので、私が望むようにクラスとインターフェースをモデル化できますが、JPA仕様にはありません –

+0

@NeilStockton '@EmbeddedId(targetEntity = Key.class)private IKey id; 'が表示されますが、「エラー:シンボルを見つけることができません」というメッセージが表示されます。だから私は別のアプローチを完全に使わなければならないと思いますか?多分IdClass? (私はインターフェースを保持しなければならず、JPA以外のものも使用できません) – Higemaru

+1

インターフェースはJPA以外の機能です。 –

答えて

0

私はそれが可能であるかはわかりません。

まず、@Embeddableが対象クラスに適用され、多くの場合、多くの場合、特定のクラスのリフレクションが必要な多くのフレームワークのメカニズムには適用されないため、リフレクションに関する私の経験ではインターフェイスを使用できませんクラスをインスタンス化することができます....もちろん、Javaのインタフェースは抽象クラスの特殊なケースであるため、インタフェースは不可能です。

は、私は、これはあなたが

+0

さて、確かに知っているのが最善でしょう;-)代わりにIdClassを使う必要があると思いますか? – Higemaru

+0

yess私の人格アドバイスは、リフレクション使用の具体的なクラスを使用するフレームワークを使用するときです。 –

+0

私の不確実性の要点は、Hibernateがアノテーション処理を実装しているので分かりません。 relfectionは、それを使用するフレームワークを使用していて、それがどのように詳細に動作しているかわからない場合、より良いアイデアではありません。いくつかのコード行で、frameworkがyourClassと言うだけで十分です。instance()と例外が発生する –

関連する問題