Я пытаюсь реализовать JPA / Hibernate5.X в старой программе JDBC CRUD для учебных целей. Это означает, что я все еще молодой падаван с JPA / Hibernate.
Я получил 2 родительских объекта: Исполнитель - Выпуск .
Выпуск получил 2 подкласса. Альбом и Компиляция
Для работы «Много ко многим» нам нужен третий JoinTable (art_alb) с PK обоих родительских объектов в виде столбцов, и эта таблица должна иметь Composite PrimaryKey (artist_id, album_id) или, по крайней мере, на нем не должно быть PK, потому что мы будем видеть один и тот же artist_id или album_id несколько раз в JoinTable.
Проблема
Мои текущие сопоставления на Compilation.java соответствуют указанным выше критериям. Но проблема возникает, когда я пытаюсь сопоставить подкласс Album с Join в таблице art_alb .
Мое сопоставление Album.java, похоже, также работает, за исключением одной критической ошибки: они создают PK с одним столбцом в нашем JoinTable (art_alb), и поэтому мы получаем ConstraintViolationException.
java.sql.SQLIntegrityConstraintViolationException: Duplicate entry '67e7ab93-0218-410a-9f4c-610a97237d32' for key 'PRIMARY'
Релиз суперкласса:
@Entity
@Table(name="album") //Dont Let the name confuse you, just MySQL doesnt like Release as a TableName.
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="altype",discriminatorType=DiscriminatorType.STRING)
public abstract class Release implements Serializable {
@Id
@Column(name = "albid", unique = true, nullable = false)
private String id;
//Extra_fields + Getter/Setters
Подкласс:
@Entity
@DiscriminatorValue("Compilation")
public class Compilation extends Release {
@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinTable(name = "alb_art",
joinColumns = {
@JoinColumn(name = "albid", nullable = false, updatable = false) },
inverseJoinColumns = {
@JoinColumn(name = "arid", nullable = false, updatable = false) },
uniqueConstraints = {
@UniqueConstraint( columnNames = {"albid", "arid"})})
private List<Artist> artists;
Альбом подкласса:
@Entity
@DiscriminatorValue("Album")
public class Album extends Release { //implements Serializable
@ManyToOne(fetch = FetchType.LAZY, cascade=CascadeType.ALL)
@JoinTable(name = "alb_art",
joinColumns = {
@JoinColumn(name = "albid", nullable = false, updatable = false)},
inverseJoinColumns = {
@JoinColumn(name = "arid", nullable = false, updatable = false) })
private Artist art;
TLDR
Итак, в общем, Я хочу - отобразить отношение ManyToOne в JoinTable (вместо JoinColumn в целевой сущности) без гибернации, создавая один столбец UniqueConstraint в JoinTable.
Вопрос OutOfScope:
Поскольку Artist.java не имеет поля Release rel;
или Collection<Release>;
, это означает, что мои отношения Artist-Release являются однонаправленными? (поправьте меня, если я ошибаюсь).
Спасибо за ваше время и внимание!