Jakarta ee EJB查找方法和多个标识符

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

我有以下包含多个@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;

    // 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,您提到的困难也与数据更新或查询有关吗?