Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JPA中的复合主键_Jpa_Persistence_Eclipselink_Composite Primary Key - Fatal编程技术网

JPA中的复合主键

JPA中的复合主键,jpa,persistence,eclipselink,composite-primary-key,Jpa,Persistence,Eclipselink,Composite Primary Key,EmbeddedId或IdClass注释用于表示复合主键。 如果没有(EmbeddedId或IdClass),如何使用复合主键 如果可以在没有(EmbeddedId或IdClass)的情况下使用复合主键,那么在复合主键的情况下如何使用EntityManager.find(实体类,对象主键)方法查找实体(多个主键)(因为没有IdClass或EmbeddedId) EclipseLink在find()操作中获取pk列表,但如果在示例中定义了复合pk键- Entity Person {

EmbeddedId或IdClass注释用于表示复合主键。 如果没有(EmbeddedId或IdClass),如何使用复合主键

如果可以在没有(EmbeddedId或IdClass)的情况下使用复合主键,那么在复合主键的情况下如何使用EntityManager.find(实体类,对象主键)方法查找实体(多个主键)(因为没有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
然后entitymanager.find(list)将接受这些参数,对吗


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

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

让我谈谈我的想法

 find

<T> T find(java.lang.Class<T> entityClass,
           java.lang.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
}
PersonKey personKey = new PersonKey(1,1);
Person p = find(Person.class, personKey);
然后,您可以根据该键查找对象。 查找(Person.class、personKey)

你的钥匙应该是这样的

public class PersonKey implements Serializable{

           String username;
           String emailId;

          public PersonKey(String username, String emailId){
                 //Add lines for correct constructor
           }
         //Override hascode and equals
}
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。预期:班级 com.staples.sa.pricemart.domain.key.ItemFileKey,获得类 java.util.ArrayList


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

在纯JPA中,您不能。它需要一个用于查找API的pk类。但是Eclipselink不需要pk类,如果您不使用JPA,可以将一组值作为pk。有没有办法只传递一个ID元素?基本上,我想查询所有拥有相同用户名的人。你可以使用createQuery或createNativeQuery,find方法不会像你想的那样工作,因为你需要传递完整的组合键。