SQL JPA - Multiple columns as primary key
Asked Answered
C

5

70

If i want severeal Column to make up an ID.

SQL example :

CONSTRAINT [PK_NAME] PRIMARY KEY ([Column1],[Column2],[Column3])

How can i do that with a Jpa Entity class ? through columndefinition ?

just setting the id field as:

value = Column1 + Column2 + Column3 // aint working.
Cacie answered 14/12, 2016 at 13:31 Comment(0)
P
138

You need to have a class for your composite key:

public class CompositeKey implements Serializable {
    private int column1;
    private int column2;
    private int column3;
}

and then in your entity class use the @IdClass annotation:

@Entity
@IdClass(CompositeKey.class)
public class EntityExample {
    @Id
    private int column1;
    @Id
    private int column2;
    @Id
    private int column3;
    ...
    ...
}

I think this should work.

There is also the other solution that @jklee mentioned. Both work, it's a matter of preference.

Purtenance answered 14/12, 2016 at 13:41 Comment(3)
Note that there is a requirement to implement equals / hashCode (see docs.jboss.org/hibernate/orm/5.4/userguide/html_single/…)Jota
How would the EntityExampleRepository extends JpaRepository< EntityExample, ???> look like in this case?Wace
@PrasannjeetSingh EntityExampleRepository extends JpaRepository<EntityExample, CompositeKey> you can take a look at jpa-buddy.com/blog/…Sibbie
W
29

Use @Embeddable and @EmbeddedId.

Example:

@Entity
public class Project implements Serializable {
    @EmbeddedId ProjectId id;
}
 
@Embeddable
class ProjectId implements Serializable {
    int departmentId;
    long projectId;
}

More information here http://www.objectdb.com/java/jpa/entity/id#Embedded_Primary_Key_

Williemaewillies answered 14/12, 2016 at 13:42 Comment(1)
Do not forget to implement Serializable ;-)Shaven
R
24

If all fields in the class are part of primary key, then solution would be pretty simple (extending solution provided by @raul-cuth):

@Entity
@IdClass(EntityExample.class)
public class EntityExample implements Serializable {

    @Id
    private int column1;

    @Id
    private int column2;

    @Id
    private int column3;
}
Roborant answered 9/8, 2018 at 9:42 Comment(1)
What if one of the fields is a FK? It would be a typical scenario when mapping a many-to-many relationship table.Mitchelmitchell
S
4
  1. Using @IdClass annotation on the @Entity class followed by @Id annotation on individual fields that are part of composite primary key.
  2. Alternatively can make use of @Embeddable class which can consist of individual fields of the composite primary key and then a reference of this class can be used as an attribute with @Embedded annotation in @Entity class. Hope this helps.
Saddlebacked answered 14/12, 2016 at 13:42 Comment(0)
M
2

Be aware that the hibernate Entity-Class-to-SQL-DDL-Script generator will sort all the fields, and irrespective of the order in which it appears in the definitions, will create the table definition and the index / constraint definitions in this sorted order of the fields.

While the order of appearance of the fields in the table definition may not matter much, the order of fields in a composite index definitely do. So your key-fields must be named so that when sorted by their names they are in the order you desire for the index).

Mantilla answered 11/10, 2019 at 20:27 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.