简体   繁体   中英

Map composite primary key to foreign key entities with Java Hibernate

I'm trying to retrieve a list of entities from a table with two primary keys which are ids to a foreign key each.

MySQL tables:

Paintings table:

id - int, PK, Auto increment
name - varchar(45)

Pictures table:

id - int, PK, Auto increment
name - varchar(45)
location - varchar(45)

painting_to_picture_link table:

painting_id - int, FK to id in painting
picture_id -  int, FK to id in painting
I've set primary key (painting_id, picture_id)
and set them to their foreign keys also as written above.

In Java:

Painting.java

@Entity
@Table(name = "paintings")
public class Painting {
    @Id
    @GeneratedValue
    @Column(name = "id")
    private int id;

    @Column(name = "name")
    private String name;           

    ...
}

Picture.java

@Entity
@Table(name = "pictures")
public class Pictures {
    @Id
    @GeneratedValue
    @Column(name = "id")
    private int id;

    @Column(name = "name")
    private String name;           

    @Column(name = "location")
    private String location;   
    ...
}

PaintingPictureLink.class

   public class PaintingPictureLink implements Serializable {

    @<SOME ANNOTATION HERE>
    private Painting painting;

    @<SOME ANNOTATION HERE>
    private Picture picture;
    ...
   }

I've seen many examples, but didn't work for me. I've tried putting @Id annotations, @EmbeddedId, etc... non worked. The errors I get are that table isn't mapped, could not determine type for the models, missing @Id annotation... :|

Would appreciate help with querying this table and getting a list of PaintingPictureLink.

Some of the examples I've followed:

https://access.redhat.com/documentation/en-US/JBoss_Enterprise_Web_Server/1.0/html/Hibernate_Annotations_Reference_Guide/ch03s02s06.html

Using an Entity (and their Primary Key) as another Entity's Id

Thanks,

Guy

Derp

Found the solution.

I created a primary key class:

@Embeddable
public class PicturePaintingPK implements Serializable {
    @ManyToOne
    private Painting painting;

    @ManyToOne
    private Picture picture;

    public PicturePaintingPK() {}

    // getters and setters //        
}

In the PicturePaintingLink class:

   @Entity
   @Table(name = "painting_to_picture_link")
   public class PaintingPictureLink implements Serializable {

        @Id
        private PicturePaintingPK primaryKey = new PicturePaintingPK()

        ...
        //constructor//
        ...

        public TTPK getPrimaryKey() {
            return primaryKey;
        }

        public void setPrimaryKey(TTPK primaryKey) {
            this.primaryKey = primaryKey;
        }

        // ... all the other getters and setters needed .... //
   }

The source for this solution was from:

Example from Hibernate forum

Guy

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM