出于学习目的,我正在尝试在旧的JDBC CRUD程序上实现 JPA / Hibernate5.X 。这意味着我还是JPA / Hibernate的年轻朋友。
我有2个父实体:艺术家-发布。
发布有2个子类。 相册和编译
相册仅由 1 位艺术家( ManyToOne )组成。
编译由许多艺术家( ManyToMany )组成。
要使多对多工作,我们需要第三个 JoinTable(art_alb),其中两个父实体的PK作为列,并且此表应具有 Composite PrimaryKey ( artist_id,album_id)或至少不应该有任何PK,因为我们将在JoinTable中多次看到相同的artist_id或album_id。
问题
我当前在Compilation.java上的映射达到上述条件。但是,当我尝试将专辑子类映射到 art_alb 表上的Join时,就会出现问题。
除了一个关键错误外,我的Album.java映射似乎也可以正常工作,它们在我们的JoinTable(art_alb)中创建了一个单列PK,因此我们得到了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列。
范围外问题:
由于Artist.java没有任何Release rel;
或Collection<Release>;
字段,这意味着我与Artist-Release的关系是单向的吗? (如果我错了,请纠正我)。
感谢您的时间和考虑!