Jakarta ee EJB查找方法和多个标识符
我有以下包含多个@Id的实体bean:Jakarta ee EJB查找方法和多个标识符,jakarta-ee,ejb,Jakarta Ee,Ejb,我有以下包含多个@Id的实体bean: @Entity @Table (name="meta_tables") public class MetaTableEnt implements Serializable{ @Id @Column(name="data_ind") private Integer dataInd; @Id @Column(name="sk") private Integer sk; // ot
@Entity
@Table (name="meta_tables")
public class MetaTableEnt implements Serializable{
@Id
@Column(name="data_ind")
private Integer dataInd;
@Id
@Column(name="sk")
private Integer sk;
// other columns
}
并且需要实现find方法:
MetaTableEnt mte = em.find(MetaTableEnt.class, object);
我定义对象如下,但这不起作用:
public class MetaTableKey implements Serializable {
public int dbInd;
public int sk;
}
MetaTableKey object = new MetaTableKey();
object.dbInd = dbInd;
object.sk = sk;
我收到以下错误消息:
为类bi.metadata.MetaTableEnt提供了错误类型的id。应为:class bi.metadata.MetaTableEnt,获得class bi.metadata.MetaTableDao$MetaTableKey
此代码有什么问题?您需要使用
@EmbeddedId
类定义实体
因此,您的原始实体将具有:
@Entity
@Table (name="meta_tables")
public class MetaTableEnt implements Serializable {
@EmbeddedId
private MetaTableEntPK pk;
... etc
您的可嵌入类将是:
@Embeddable
public class MetaTableEntPK implements Serializable {
@Column(name="data_ind")
private Integer dataInd;
@Column(name="sk")
private Integer sk;
public MetaTableEntPK(Integer dataInd, Integer sk) {
this.dataInd = dataInd;
this.sk = sk;
}
}
那么您的查找代码将类似于:
MetaTableEntPK pk = new MetaTableEntPK(1, 2);
MetaTableEnt mte = em.find(MetaTableEnt.class, pk);
注意:在JPQL查询中,您需要将此PK中的字段称为PK.dataInd
,例如。例如,下面的查询将查找所有具有特定dataInd
的MetaTableEnt
对象:
SELECT object(x) FROM MetaTableEnt x WHERE x.pk.dataInd = 1
顺便说一下,别听我的。我们的400多个实体中有130个使用这些
@可嵌入的键,它们没有什么特别困难的地方。。但你最好避免使用复合Kay。这只是许多困难中的第一个。我将只使用这个实体bean,您提到的困难也与数据更新或查询有关吗?