5

EmbeddedId 或 IdClass 注释用于表示复合主键。我如何在没有( EmbeddedId 或 IdClass )的情况下使用复合主键

如果可以在没有( EmbeddedId 或 IdClass )的情况下使用复合主键,那么我如何使用EntityManager.find( Entity Class , Object primaryKey) 方法在复合主键(Multiple Primarykey)的情况下查找实体(因为没有 IdClass 或嵌入式标识符)。

EclipseLink 在 find() 操作中获取 pk 列表,但如果示例中定义了复合 pk 键 -

    Entity Person {
           @Id 
           String username;
           @Id
           String emailId;
           @Basic
           String firstName;
           @Basic
           String lastName;
    }

    List list = new ArrayList();
    list.add(${username});  //Run time value
    list.add(${emailId});   //Run time value

然后EnitityManager.find(list)将采用这些参数,对吗?

如果我假设正确,那么 EnitityManager.find() 操作将如何知道 List 1st 参数是用户名或 emailId pk 值(表示复合 pk 字段值的序列)

4

3 回答 3

6

让我谈谈我的想法。

 find

<T> T find(java.lang.Class<T> entityClass,
           java.lang.Object primaryKey)

为了找到类 Person 的实体,你应该使用类似的东西

find(Person.class, Object primaryKey)

因为你有一个组合键,你应该有一个像这样的 IdClass 或 EmbeddedId。

public class PersonKey implements Serializable{

           String username;
           String emailId;

          public PersonKey(String username, String emailId){
                 //Add lines for correct constructor
           }
         //Override hascode and equals
}

然后您可以根据该键找到对象。查找(Person.class,personKey);

你的钥匙需要是这样的。

PersonKey personKey = new PersonKey(1,1);
Person p = find(Person.class, personKey);

在纯 JPA 中查找不接受列表!,只接受并返回一个托管对象。如果您要使用find检索多个对象,则应调用该方法 N 次,传递您要查找的键。

如果您使用 find 传递一个列表,您将看到类似这样的内容。

org.springframework.dao.InvalidDataAccessApiUsageException:为类 domain.model.Person 提供了错误类型的 id。预期:类 domain.key.PersonKey,得到类 java.util.ArrayList;嵌套异常是 java.lang.IllegalArgumentException:为类 com.staples.sa.pricemart.domain.model.ItemFileEntity 提供了错误类型的 id。预期:com.staples.sa.pricemart.domain.key.ItemFileKey 类,得到类 java.util.ArrayList

似乎 eclipseLink发现您可以做到这一点,但为了使您的应用程序更便携,请尝试使用 JPA 中描述的 find 。

于 2014-02-03T16:56:15.620 回答
0

您应该能够在 EclipseLink 中使用带有 find() 操作的 List。

于 2013-06-11T13:27:49.730 回答
0

您应该将实体作为主键:

Person id = new Person();
id.setUsername("Username");
id.setEmailId("EmailId");
entityManager.find(Person.class, id);

JPA 将使用带有注释的字段@Id来查找您需要的记录。

于 2021-07-23T16:40:57.443 回答