JPA table with 2 primary key fields

45,706

I don't use NetBeans so I can't really say anything about its mapping tools.

For mapping a composite key, there are a couple of options. You can

  • Define a separate @Embeddable object with the PK fields and use it as @EmbeddedId in your @Entity class

    @Embeddable
    public class MyCompositePK { 
        @Column
        private String fieldA;
        @Column
        private String fieldB;
    }
    @Entity 
    public class MyBean { 
        @EmbeddedId
        private MyCompositePK id;
        @Column
        private String fieldC;
    }
    
  • Define a non-mapped POJO with the PK fields and use it as @IdClass in the @Entity.

    @Entity
    @IdClass(value=ClassAB.ClassABId.class)
    public class ClassAB implements Serializable {
        private String idA;
        private String idB;
    
        @Id
        @Column(name="ID_A")
        public String getIdA(){ return idA; }
        public void setIdA(String idA){ this.idA = idA; }
    
        @Id
        @Column(name="ID_B")
        public String getIdB(){ return idB; }
        public void setIdB(String idB){ this.idB = idB; }
    
        static class ClassABId implements Serializable {
            private String idA;
            private String idB;
    
            public String getIdA(){ return idA; }
            public void setIdA(String idA){ this.idA = idA; }
    
            public String getIdB(){ return idB; }
            public void setIdB(String idB){ this.idB = idB; }
    
            // implement equals(), hashcode()
        }
    }
    

    In this example ClassABId is a static inner class just for convenience.

These options are also explained in Pascal Thivent's excellent answer to this question: How to map a composite key with Hibernate?.

This related question discusses differences between these approaches: Which anotation should I use: @IdClass or @EmbeddedId. Notice the fields' declaration gets duplicated with the @IdClass approach.

Anyhow, I don't think there's an alternative to creating two classes. That's why I asked this question : Mapping a class that consists only of a composite PK without @IdClass or @EmbeddedId. It seems there's an hibernate-specific feature for this.

As a side note, if you've got control over the DB structure, you might also consider avoiding composite keys. There are some reasons to do so.

Share:
45,706
user2046810
Author by

user2046810

Updated on December 10, 2020

Comments

  • user2046810
    user2046810 over 3 years

    I have a table which contains only 2 fields. The table has a composite PK formed by these two fields.

    When using Netbeans for creating entity beans from database, the entity bean is not created automatically like other tables that have more than 2 fields.

    So I guess I need to create the entity bean myself. What is the best practice for creating this entity bean? Does it have to contain COMPOSITE KEY object or not?

  • Tom Anderson
    Tom Anderson over 11 years
    Given that the object contains only the two primary key fields, can it be its own IdClass?
  • Xavi López
    Xavi López over 11 years
    @TomAnderson That's interesting. I've never tried. It seems that someone did, with no success. The spec doesn't seem to pronounce on this. Might depend on the implementation.
  • Alvin Thompson
    Alvin Thompson over 8 years
    @TomAnderson: I don't think so, because the ID class has to implement its equals() method based on just the composite key values.