在 ManyToMany 上添加主键(用于发布)
Add Primary key on ManyToMany (for Publication)
我在两个实体之间有一个 ManyToMany 关系
@javax.persistence.Entity
@Table(name = "t_aircraft_model")
public class AircraftModel extends DbObject {
@ManyToMany(fetch=FetchType.LAZY)
@JoinTable(name = "t_aircraft_model_entity", joinColumns = { @JoinColumn(name = "aircraft_model_uid", nullable = false) }, inverseJoinColumns = { @JoinColumn(name = "entity_id_LDAP", nullable = false) })
private List<com.airbushelicopter.ahead.db.pojo.Entity> entities ;
但是 sqlServer 不允许我发布中间 table : t_aircraft_model_entity
我考虑了 2 个解决方案
- table 和 t_aircraft_model_entity 的两列都成为主键(好的,在我的例子中,飞机不能多次链接到同一个实体)
- 我添加第 3 列 (id),它将作为主键
- 或者?
但我不知道如何使用休眠和注释来做到这一点。
谢谢!
要事第一。你将需要 3 tables 来建立多对多关系,当然,你需要确保你的其他两个 tables 都有 PK
在代码方面,您可以这样做:
您的飞机型号:
@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.PERSIST)
@JoinTable(name = "t_aircraft_entity_relation",joinColumns = {
@JoinColumn(name = "aircraftid", nullable = false, updatable = false)},
inverseJoinColumns = { @JoinColumn(name = "entityid",nullable = false,updatable= false)
})
private Set<com.airbushelicopter.ahead.db.pojo.Entity> entities ;
在您的实体模型上:
@ManyToMany(fetch = FetchType.EAGER,mappedBy="entities")
private Set<AircraftModel> aircrafts;
你必须创建一个关系 table,就像我的例子:
CREATE TABLE t_aircraft_entity_relation
(
aircraftid integer NOT NULL,
entityid integer NOT NULL,
CONSTRAINT "PK_AIRCRAFT_ENTITY" PRIMARY KEY (aircraftid, entityid),
CONSTRAINT "FK_AIRCRAFT_ENTITY" FOREIGN KEY (aircraftid)
REFERENCES t_aircraft_model (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT "FK_ENTITY_AIRCRAFT" FOREIGN KEY (entityid)
REFERENCES t_entity_model (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
PS:SQL这一块是基于Postgresql的,所以你需要做一点改动。
我在两个实体之间有一个 ManyToMany 关系
@javax.persistence.Entity
@Table(name = "t_aircraft_model")
public class AircraftModel extends DbObject {
@ManyToMany(fetch=FetchType.LAZY)
@JoinTable(name = "t_aircraft_model_entity", joinColumns = { @JoinColumn(name = "aircraft_model_uid", nullable = false) }, inverseJoinColumns = { @JoinColumn(name = "entity_id_LDAP", nullable = false) })
private List<com.airbushelicopter.ahead.db.pojo.Entity> entities ;
但是 sqlServer 不允许我发布中间 table : t_aircraft_model_entity
我考虑了 2 个解决方案
- table 和 t_aircraft_model_entity 的两列都成为主键(好的,在我的例子中,飞机不能多次链接到同一个实体)
- 我添加第 3 列 (id),它将作为主键
- 或者?
但我不知道如何使用休眠和注释来做到这一点。
谢谢!
要事第一。你将需要 3 tables 来建立多对多关系,当然,你需要确保你的其他两个 tables 都有 PK
在代码方面,您可以这样做:
您的飞机型号:
@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.PERSIST)
@JoinTable(name = "t_aircraft_entity_relation",joinColumns = {
@JoinColumn(name = "aircraftid", nullable = false, updatable = false)},
inverseJoinColumns = { @JoinColumn(name = "entityid",nullable = false,updatable= false)
})
private Set<com.airbushelicopter.ahead.db.pojo.Entity> entities ;
在您的实体模型上:
@ManyToMany(fetch = FetchType.EAGER,mappedBy="entities")
private Set<AircraftModel> aircrafts;
你必须创建一个关系 table,就像我的例子:
CREATE TABLE t_aircraft_entity_relation
(
aircraftid integer NOT NULL,
entityid integer NOT NULL,
CONSTRAINT "PK_AIRCRAFT_ENTITY" PRIMARY KEY (aircraftid, entityid),
CONSTRAINT "FK_AIRCRAFT_ENTITY" FOREIGN KEY (aircraftid)
REFERENCES t_aircraft_model (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT "FK_ENTITY_AIRCRAFT" FOREIGN KEY (entityid)
REFERENCES t_entity_model (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
PS:SQL这一块是基于Postgresql的,所以你需要做一点改动。