【问题标题】:Many-to-Many Association with Extra Columns与额外列的多对多关联
【发布时间】:2017-12-23 18:16:00
【问题描述】:

即使按照以下提供的所有步骤,我也无法正确映射: https://www.mkyong.com/hibernate/hibernate-many-to-many-example-join-table-extra-column-annotation/

CREATE TABLE `tb_pla_playlist` (
`id_playlist` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`nm_playlist` VARCHAR(10) NOT NULL,
PRIMARY KEY (`id_playlist`) USING BTREE,
)
CREATE TABLE `tb_mid_midia` (
`id_midia` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`nm_midia` VARCHAR(10) NOT NULL,
PRIMARY KEY (`id_midia`) USING BTREE
)
CREATE TABLE  `tb_mip_midia_playlist` (
`id_midia` INT(10) UNSIGNED NOT NULL,
`id_playlist` INT(10) UNSIGNED NOT NULL,
`nr_ordem` INT(10) UNSIGNED NOT NULL,
`CREATED_BY` VARCHAR(10) NOT NULL,
PRIMARY KEY (`id_midia`,`CATEGORY_ID`),
CONSTRAINT `FK_id_midia` FOREIGN KEY (`id_midia`)
         REFERENCES `midia` (`id_midia`),
CONSTRAINT `FK_id_playlist` FOREIGN KEY (`id_playlist`)
         REFERENCES `playlist` (`id_playlist`)
)

播放列表.java

@Entity
@Table(name="tb_pla_playlist")
public class Playlist implements Serializable {
private Set<MidiaPlaylist> midiaPlaylist = new HashSet<MidiaPlaylist>(); 

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="id_playlist")
private Long idPlaylist;

@OneToMany(mappedBy = "id.playlist", cascade = CascadeType.ALL)
private Set<MidiaPlaylist> getMidiaPlaylist(){
    return midiaPlaylist;
}
...
}

[错误:在属性“midiPlaylist”中,“映射者”值“id.playlist”无法解析为目标实体上的属性。]

midi.java

@Entity
@Table(name="tb_mid_midia")
public class Midia implements Serializable {
private Set<MidiaPlaylist> midiaPlaylist = new HashSet<MidiaPlaylist>(); 

@Id
@GeneratedValue
@Column(name="id_midia")
private Long idMidia;

@OneToMany(mappedBy = "id.midia", cascade=CascadeType.ALL)  
public Set<MidiaPlaylist> getMidiasPlaylist() {
    return midiaPlaylist;
}

[错误:在属性“midiasPlaylist”中,“映射者”值“id.mdia”无法解析为目标实体上的属性。]

MidiaPlaylistPK.java

@Embeddable
public class MidiaPlaylistPK implements Serializable {
    private Midia midia;
private Playlist playlist;

@ManyToOne(cascade = CascadeType.ALL)
public Midia getMidia(){
    return midia;
}
public void setMidia(Midia midia){
    this.midia = midia;
}

@ManyToOne(cascade = CascadeType.ALL)
public Playlist getPlaylist(){
    return playlist;
}

public void setPlaylist(Playlist playlist){
    this.playlist = playlist;
}
}

MidiaPlaylist.java

@Entity
@Table(name="tb_mip_midia_playlist")
@AssociationOverrides({
   @AssociationOverride(name="id.playlist", [erro: Persistent type of override attribute "id.playlist" cannot be resolved]
   joinColumns = @JoinColumn(name = "id_playlist")),
   @AssociationOverride(name="id.midia", [erro: Persistent type of override attribute "id.midia" cannot be resolved]
   joinColumns = @JoinColumn(name = "id_midia"))
   })
 public class MidiaPlaylist implements Serializable {   
 private MidiaPlaylistPK id = new MidiaPlaylistPK();
 private int nrOrdem;

 @EmbeddedId    [erro: Embedded ID class should not contain relationship mappings]
 public MidiaPlaylistPK getId() {
    return this.id;
 }
@Column(name="nr_ordem", nullable=false)
public int getNrOrdem(){
    return this.nrOrdem;
}

@Transient
public Midia getMidia(){
    return getId().getMidia();
}

@Transient
public Playlist getPlaylist(){
    return getId().getPlaylist();
}

Relational model

有人可以帮我解决这些错误吗?太棒了!

【问题讨论】:

    标签: java hibernate jpa many-to-many hibernate-mapping


    【解决方案1】:

    您应该删除@Embeddable 中的@ManyToOne 注释并使用@MapId 注释插入@Transient,这里有一个示例: http://www.objectdb.com/api/java/jpa/MapsId

    【讨论】:

    • 我在制图方面的经验很少。我不明白为什么会出现这些错误。我需要在媒体和播放列表之间创建多对多关系。有什么简单的方法可以做到这一点?在 MapId 上搜索,显然它做了一个多对一映射,在这种情况下,我需要带有额外列的多对多。 link
    • 感谢您帮助我。那会是解决方案吗? ´@MapsId("midia") public Long getMidia(){ return getId().getIdMidia(); } @MapsId("playlist") public Long getPlaylist(){ return getId().getIdPlaylist(); } @ManyToOne Midia midia; @ManyToOne Playlist playlist; @Column(name="nr_ordem", nullable=false) public int getNrOrdem(){ return this.nrOrdem; }
    • 在当前示例中是的,它用于多对一映射(它仅显示如何使用 MapsId 注释),但在您的情况下,您将有两个 MapsId,您将得到您想要的。
    • 不,您应该只有 id 值 MidiaPlaylistPK(不是实体),以及在 MidiaPlaylist 中具有映射和 MapsIds 的实体。
    猜你喜欢
    • 1970-01-01
    • 2011-07-04
    • 1970-01-01
    • 2014-04-29
    • 1970-01-01
    • 2019-10-16
    • 1970-01-01
    • 2014-09-30
    相关资源
    最近更新 更多