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 字段值的序列)
让我谈谈我的想法。
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 。
| 归档时间: |
|
| 查看次数: |
18046 次 |
| 最近记录: |