EmbeddedId或IdClass注释用于表示复合主键。 如何在没有(EmbeddedId或IdClass)的情况下使用复合主键?
如果可以在没有(EmbeddedId或IdClass)的情况下使用复合主键,那么在复合主键的情况下如何使用 EntityManager.find(Entity Class,Object primaryKey)方法查找实体 (多个主键)(因为没有IdClass或EmbeddedId)。
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参数是username或emailId pk值(表示复合pk字段值的序列)
答案 0 :(得分:2)
让我谈谈它。
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
}
然后您可以根据该键找到对象。 find(Person.class,personKey);
你的关键需要是这样的。
PersonKey personKey = new PersonKey(1,1);
Person p = find(Person.class, personKey);
发现不接受PURE JPA中的列表!! ,只接受并返回一个托管对象。如果你使用 find 来检索多个对象,你应该调用方法N次传递你想要找到的键。
如果您使用find传递列表,您将看到类似这样的内容。
org.springframework.dao.InvalidDataAccessApiUsageException: 为类domain.model.Person提供了错误类型的id。预期: class domain.key.PersonKey,得到类java.util.ArrayList;嵌套 异常是java.lang.IllegalArgumentException:提供的id 类的错误类型 com.staples.sa.pricemart.domain.model.ItemFileEntity。预期:上课 com.staples.sa.pricemart.domain.key.ItemFileKey,上课了 的java.util.ArrayList
似乎eclipseLink有发现你可以做到这一点,但为了让你的应用程序更具可移植性,尝试使用JPA中描述的find。
答案 1 :(得分:0)
您应该能够在EclipseLink中使用带有find()操作的List。
答案 2 :(得分:0)
你应该给一个实体作为主键:
Person id = new Person();
id.setUsername("Username");
id.setEmailId("EmailId");
entityManager.find(Person.class, id);
JPA 将使用带有 @Id
注释的字段来查找您需要的记录。