Generics and Composite Keys
jimk1723 Feb 15, 2007 7:05 PMI have a situation where a set of entities share a similar composite key class; rather than create a new PK class for each entity, I wanted to genericise the PK.
Here's my generic PK class:
@Embeddable
public class LanguagePK<T> implements Serializable {
private T describes;
private String code;
@Column(name = "LANG_CODE")
public String getCode() {
return this.code;
}
public void setCode(String code) {
this.code = code;
}
public T getDescribes() {
return this.describes;
}
public void setDescribes(T described) {
this.describes = described;
}
}
...and here's a sample entity that embeds it (Foo is another entity)
@Entity
@Table(name = "FOO_LANG")
public class FooLanguage implements Serializable{
LanguagePK<Foo> pk;
@EmbeddedId()
@AttributeOverrides( { @AttributeOverride(name = "describes", column = @Column(name = "FOO_ID")) })
public LanguagePK<Foo> getPk() {
if (pk == null) {
pk = new LanguagePK<Foo>();
}
return pk;
}
public void setPk(LanguagePK<Foo> pk) {
this.pk = pk;
}
@Transient
public Foo getFoo() {
return getPk().getDescribes();
}
public void setFoo(Foo e) {
getPk().setDescribes(e);
}
@Transient
public String getCode() {
return getPk().getCode();
}
public void setCode(String code) {
getPk().setCode(code);
}
}
I'm getting the "Property X has an unbound type and no explicit target entity" exception when I try to use it.
[testng] javax.persistence.PersistenceException: java.lang.IllegalStateException: Property describes has an unbound type and no explicit target entity. [testng] at org.hibernate.ejb.Ejb3Configuration.createEntityManagerFactory(Ejb3Configuration.java:217) [testng] at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:114) [testng] at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:37) [testng] at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:27)
I've poked around, but I haven't found any example code on how to do something like this. Am I'm trying to do something I shouldn't?