Java 当id(主键)大于1时,如何获取EntityManager.getReference?

Java 当id(主键)大于1时,如何获取EntityManager.getReference?,java,jpa,entitymanager,zk,Java,Jpa,Entitymanager,Zk,伙计们,我急切地想知道如何使用EntityManager.getReference和1个以上的主键,因为当我想更新数据时,总是会出错, 错误消息类似于: [EL Fine]:sql:Connection(1713950866)--选择类别、子类别、代码、CreatedBy、CreatedDateTime、IsActive、备注、UpdateBy、UpdateDateTime、master.sysParameter中的值,其中((类别=?)和(子类别=?)和(代码=?) bind=>[acm,ac

伙计们,我急切地想知道如何使用EntityManager.getReference和1个以上的主键,因为当我想更新数据时,总是会出错, 错误消息类似于:

[EL Fine]:sql:Connection(1713950866)--选择类别、子类别、代码、CreatedBy、CreatedDateTime、IsActive、备注、UpdateBy、UpdateDateTime、master.sysParameter中的值,其中((类别=?)和(子类别=?)和(代码=?) bind=>[acm,acm,acm] javax.persistence.EntityNotFoundException:找不到id为acm的实体 位于org.eclipse.persistence.internal.jpa.EntityManagerImpl.getReference(EntityManagerImpl.java:1398)

在我的代码中,我想定义3个变量,但我只得到1(acm)。 以下是我的代码示例:

    public boolean updateSysParameter(MasterSysParameterEntity masterSysParameter) {
    // TODO Auto-generated method stub
    boolean retVal = false;
    try{
        MasterSysParameterEntity updateSysParameter;
        em = getEntityManagerFactory();
        em.getTransaction().begin();
        System.out.println("masterSysParameter.getCategory() => " +masterSysParameter.getCategory());

        updateSysParameter = em.getReference(MasterSysParameterEntity.class, masterSysParameter.getCategory());
        updateSysParameter = em.getReference(MasterSysParameterEntity.class, masterSysParameter.getSubCategory());
        updateSysParameter = em.getReference(MasterSysParameterEntity.class, masterSysParameter.getCode());

        updateSysParameter = em.merge(masterSysParameter);

        em.getTransaction().commit();
        retVal = true;
    }catch (Exception e) {
        if(em != null && null != em.getTransaction())
            em.getTransaction().rollback();
        e.printStackTrace();
    } finally {
        if (em != null) {
            em.close();
        }
    }
    return retVal;
}

非常感谢您的建议和帮助,当您在一个实体中有多个
@Id
字段,然后您定义了一个
@IdClass
时,这确实意义重大。因此调用
em.getReference
将第二个参数作为“IdClass”的实例传入


如果有多个“Id”字段,那么您应该为该类传入一个“IdClass”类型的对象。我仍然不知道如何将em.getReference与这个IdClass一起使用,您有示例吗?我已经定义了IdClass并创建了类似于您共享的链接的类。然后我被困在实现em.getReferenceNo这个概念谁是“dude”,也不知道为什么你需要一个“示例”(帖子中的链接向你展示了如何创建一个IdClass…但是你必须做到这一点才能做到这一点-但是你仍然没有在“问题”中引用你的实体类)。更新了说明getReference调用的帖子。
MyIdClass myId = new MyIdClass(...); // Pass in whatever args your IdClass needs
MyEntity ent = em.getReference(MyEntity.class, myId);