【问题标题】:How can I get EntityManager.getReference when the id(primay keys) are more than 1?当 id(主键)大于 1 时,如何获取 EntityManager.getReference?
【发布时间】:2016-04-08 19:03:27
【问题描述】:

伙计们,我非常想知道如何将 EntityManager.getReference 与 1 个以上的主键一起使用,因为当我想更新数据时总是会出错, 错误消息有点像:

[EL Fine]: sql: Connection(1713950866)--SELECT Category, SubCategory, Code, CreatedBy, CreatedDateTime, IsActive, Remarks, UpdatedBy, UpdatedDateTime, Value FROM master.sysParameter WHERE (((Category = ?) AND (子类别 = ?)) AND (代码 = ?)) 绑定 => [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”类型的对象

标签: java jpa entitymanager zk


【解决方案1】:

如果实体中有多个 @Id 字段,则定义一个 @IdClass on the entity for the composite id。因此,您调用em.getReference,将第二个参数作为“IdClass”的实例传递。

MyIdClass myId = new MyIdClass(...); // Pass in whatever args your IdClass needs
MyEntity ent = em.getReference(MyEntity.class, myId);

【讨论】:

  • 老兄,我仍然不明白如何将 em.getReference 与这个 IdClass 一起使用,你有例子吗?我已经定义了 IdClass 并创建了类似于您共享的链接的类。然后我被卡住了执行这个 em.getReference
  • 不知道“老兄”是谁,也不知道为什么需要一个“示例”(帖子中的链接向您展示了如何创建 IdClass ...但是您必须这样做才能得到这个远 - 但你仍然没有在你的“问题”中引用你的实体类)。更新了说明 getReference 调用的帖子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-06
  • 2021-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-26
  • 1970-01-01
相关资源
最近更新 更多