次の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つのフィールドを持つオブジェクトである必要があります。彼らの名前と種類は関係ありません。重要なことは、Key
がThing
の複合キーであることです。
シンプル(または任意の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に関連するかもしれない、少なくともエラーが同様である。)
にHibernateのようなインタフェースをサポートして考えてはいけない助けることができることを願って、あなたは、使用されている実装を指定するには、注釈の「targetEntity」を指定する必要がありますので、おそらくあなたはそれを行うべきです。私が使っている実装(DataNucleus)はJPAベンダー拡張としてのインターフェースをサポートしていますので、私が望むようにクラスとインターフェースをモデル化できますが、JPA仕様にはありません –
@NeilStockton '@EmbeddedId(targetEntity = Key.class)private IKey id; 'が表示されますが、「エラー:シンボルを見つけることができません」というメッセージが表示されます。だから私は別のアプローチを完全に使わなければならないと思いますか?多分IdClass? (私はインターフェースを保持しなければならず、JPA以外のものも使用できません) – Higemaru
インターフェースはJPA以外の機能です。 –