我有以下4个表:
create table market (
id int(6) unsigned auto_increment primary key,
market_id varchar(30) unique
);
create table market_channel_group (
id int(6) unsigned auto_increment primary key,
market_id varchar(30),
channel_group_id varchar(30),
unique index (market_id,channel_group_id)
);
create table market_channel (
id int(6) unsigned auto_increment primary key,
market_id varchar(30),
channel_id varchar(30),
unique index (market_id,channel_group_id)
);
create table market_channel_group_detail (
id int(6) unsigned auto_increment primary key,
market_id varchar(30),
channel_group_id varchar(30),
channel_id varchar(30),
unique index (market_id,channel_group_id, channel_id)
);
可以看到,市场是一个多到market_channel_group, market_channel。market_channel_group是manymany到特定市场下的market_channel
问题是在我的market_channel_group实体,我有以下代码:
@Entity(name = "market_channel_group")
@Table(name = "market_channel_group", uniqueConstraints = {@UniqueConstraint(columnNames = {"market_id", "channel_group_id"})})
public class MarketChannelGroup extends BaseEntity {
private static final long serialVersionUID = 1L;
public MarketChannelGroup() {
super();
}
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private int id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "market_id", referencedColumnName = "market_id")
private Market market;
@Column(name = "channel_group_id", length = 50)
private String channelGroupId;
@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinTable(name = "market_channel_group_detail",
joinColumns = {@JoinColumn(name = "market_id", referencedColumnName = "market_id"), @JoinColumn(name = "channel_group_id", referencedColumnName = "channel_group_id")},
inverseJoinColumns = {@JoinColumn(name = "market_id", referencedColumnName = "market_id"), @JoinColumn(name = "channel_id", referencedColumnName = "channel_id")})
private List<MarketChannel> channels;
...
}
然而,我得到了这个异常:
Caused by: org.hibernate.MappingException: Repeated column in mapping for collection: MarketChannelGroup.channels column: market_id
at org.hibernate.mapping.Collection.checkColumnDuplication(Collection.java:343) ~[hibernate-core-4.3.6.Final.jar:4.3.6.Final]
...
我应该如何正确地编写manymany注释?还是我的设计有什么问题?
由于我们将从外部资源导入数据,因此自动增量id不用作其他表的引用,每个表除了自己的id之外还有另一个索引。
对于我来说,这是通过将insertable = false, updatable = false
添加到@JoinColumn
来解决的。