[Edit]
+
0
-
0

Hibernate - @ElementCollection relation with composite key practical example (java, complex key, OneToMany, @EmbeddedId, @CollectionTable, @Embeddable)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
// ----------------------------------------------------------- // SomeBaseEntity.java // ----------------------------------------------------------- import javax.persistence.CollectionTable; import javax.persistence.Column; import javax.persistence.ElementCollection; import javax.persistence.EmbeddedId; import javax.persistence.Entity; import javax.persistence.EnumType; import javax.persistence.Enumerated; import javax.persistence.FetchType; import javax.persistence.JoinColumn; import javax.persistence.Table; @Setter @Getter @NoArgsConstructor @EqualsAndHashCode(onlyExplicitlyIncluded = true) @Entity @Table(name = "some_base_table") public class SomeBaseEntity { @EmbeddedId @EqualsAndHashCode.Include private SomeCompositeKey someCompositeKey; // 3 fields - field_1, field_2, field_3 // ... some other columns // instead of using OneToMany and foreign key in native SQL table schema // we use hibernate mechanism to manage below relation for us @ElementCollection(fetch = FetchType.EAGER) @CollectionTable(name = "some_table", joinColumns = { // those 3 x fields are fields of SomeCompositeKey @JoinColumn(name = "field_1", referencedColumnName = "field_1"), @JoinColumn(name = "field_2", referencedColumnName = "field_2"), @JoinColumn(name = "field_3", referencedColumnName = "field_3") }) List<SomeEntity> someField; } // ----------------------------------------------------------- // SomeEntity.java // ----------------------------------------------------------- import javax.persistence.Column; import javax.persistence.Embeddable; @Embeddable @Data @NoArgsConstructor public class SomeEntity { // we do not define 3 fields - field_1, field_2, field_3 // also we do not add those fields as foreign key in native SQL table schema // hibernate will manage it by itself @Column(name = "field_4") private Long field4; @Column(name = "field_5") private Long field4; } // ----------------------------------------------------------- // SomeCompositeKey.java // ----------------------------------------------------------- import javax.persistence.Column; import javax.persistence.Embeddable; @Embeddable @Data @NoArgsConstructor public class SomeCompositeKey { @Column(name = "field_1") private Long field1; @Column(name = "field_2") private Long field2; @Column(name = "field_3") private Long field3; } // ----------------------------------------------------------- // database schmea // ----------------------------------------------------------- DROP TABLE IF EXISTS some_base_table; CREATE TABLE some_base_table ( field_1 BIGINT(20) NOT NULL, field_2 BIGINT(20) NOT NULL, field_3 BIGINT(20) NOT NULL, PRIMARY KEY (field_1, field_3, field_3) ) COLLATE = 'utf8_general_ci' ENGINE = InnoDB; -- we do not define foreign key in database schema DROP TABLE IF EXISTS some_table; CREATE TABLE some_table ( field_1 BIGINT(20) NOT NULL, field_2 BIGINT(20) NOT NULL, field_3 BIGINT(20) NOT NULL, field_4 BIGINT(20) NOT NULL, field_5 BIGINT(20) NOT NULL ) COLLATE = 'utf8_general_ci' ENGINE = InnoDB;