JPA 中的复合主键

Gau*_*mar 7 persistence jpa eclipselink composite-primary-key

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

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

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
Run Code Online (Sandbox Code Playgroud)

那么EnityManager.find(list)将接受这些参数,我是对的吗?

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

Koi*_*oer 7

让我谈谈我的想法。

 find

<T> T find(java.lang.Class<T> entityClass,
           java.lang.Object primaryKey)
Run Code Online (Sandbox Code Playgroud)

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

find(Person.class, Object primaryKey)
Run Code Online (Sandbox Code Playgroud)

当你有一个组合键时,你应该有一个像这样的 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
}
Run Code Online (Sandbox Code Playgroud)

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

你的钥匙需要是这样的。

PersonKey personKey = new PersonKey(1,1);
Person p = find(Person.class, personKey);
Run Code Online (Sandbox Code Playgroud)

在 PURE 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 。


Jam*_*mes 0

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