JPA中的复合主键

时间:2013-06-11 11:28:41

标签: jpa persistence eclipselink composite-primary-key

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字段值的序列)

3 个答案:

答案 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 注释的字段来查找您需要的记录。