Witam, jestem w temacie Spring JPA i próbuje skonfigurować hibernate aby wygenerowanć jedną tablice asocjacyjną dla dwóch asocjacji @ManyToMany i @OneToMany:
Mam abstrakcyjny zespół:
@Entity
@NoArgsConstructor @Getter @Setter @EqualsAndHashCode @ToString
public abstract class Band {
@Id @GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String name;
}
}
Soliste dziedzidzącego po Zespole,
który posiada pole Musician musician. Chciałbym żeby hibernate zmapował mi to pole do tabeli asocjacyjnej "band_musician" w której trzymałbym też inne asocjacje między dziećmi Band a Muzykami
@Entity
@NoArgsConstructor @Getter @Setter @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true)
public class Soloist extends Band {
@ManyToOne(cascade = CascadeType.ALL)
@JoinTable(
name = "band_musician",
joinColumns = { @JoinColumn(name = "band_id") },
inverseJoinColumns = { @JoinColumn(name = "musician_id") })
private Musician musician;
}
Kolejne dziecko ktore ma pole List<Musician> musicians. Jak wyżej chciałbym aby hibernate zmapował mi to na tabele "band_musician".
@Entity
@NoArgsConstructor @Getter @Setter @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true)
public class Chamber extends Band {
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(
name = "band_musician",
joinColumns = { @JoinColumn(name = "band_id") },
inverseJoinColumns = { @JoinColumn(name = "musician_id") })
private List<Musician> musicians = new ArrayList<>();
}
Asocjacja ma być jednokierunkowa dlatego Musician wygląda tak:
@Entity
@NoArgsConstructor @Getter @Setter @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true)
public class Musician extends Person{
private String roleName;
}
i ojciec Musician Person
@MappedSuperclass
@NoArgsConstructor @Getter @Setter @EqualsAndHashCode @ToString
public abstract class Person {
@Id @GeneratedValue(strategy= GenerationType.AUTO)
private Long id;
private String imie;
private String nazwisko;
}
Pytanie czy da się w jakiś sposób połączyć wszystkie asocjacje w jedenej tabeli "band_musician" ??
Taka konfiguracja rzuca takim błędem:
Caused by: org.h2.jdbc.JdbcSQLException: Naruszenie ograniczenia Klucza Głównego lub Indeksu Unikalnego: "PRIMARY KEY ON PUBLIC.BAND_MUSICIAN(BAND_ID)"
Unique index or primary key violation: "PRIMARY KEY ON PUBLIC.BAND_MUSICIAN(BAND_ID)"; SQL statement:
Jak widać korzystam z bazy H2. Czy da się jakoś skonfigurować aby @ManyToOne generował klucz główny na dwóch kolumnach band_id i musician_id (intuicja mi podpowiada że tu jest problem ale poprawcie mnie jeśli się mylę)