所以我在两个实体(Medewerker 和 Taak)之间存在多对多关系,这是我为这两个实体提供的代码:
@Entity
@Table(name = "T_MEDEWERKER")
public class Medewerker {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String naam;
private String functie;
@ManyToOne
@Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE)
@JoinColumn(name = "festivalId", nullable = false)
private Festival festival;
@ManyToMany
@Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE)
@JoinTable(name="T_MEDEWERKER_TAAK",
joinColumns = {@JoinColumn(name="medewerkerId")},
inverseJoinColumns = {@JoinColumn(name="taakId")})
private List<Taak> taken = new ArrayList<Taak>();
public Medewerker(){
}
public Medewerker(String naam, String functie) {
this.naam = naam;
this.functie = functie;
}
public void addTaak(Taak t) {
taken.add(t);
}
public void setFestival(Festival festival) {
this.festival = festival;
}
}
@Entity
@Table(name = "T_TAAK")
public class Taak {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String omschrijving;
@ManyToMany
@Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE})
@JoinTable(name="T_MEDEWERKER_TAAK",
joinColumns = {@JoinColumn(name="taakId")},
inverseJoinColumns = {@JoinColumn(name="medewerkerId")})
private List<Medewerker> medewerkers = new ArrayList<Medewerker>();
public Taak(){
}
public Taak(String omschrijving) {
this.omschrijving = omschrijving;
}
private void addMedewerker(Medewerker m){
medewerkers.add(m);
}
}
现在,我想让中间表(T_MEDEWERKER_TAAK)通过hibernate通过jointable自动生成。但是,我不断收到以下错误: 21:49:08,157 警告 SqlExceptionHelper:145 - SQL 错误: 1364,SQLState: HY000 21:49:08,158 错误 SqlExceptionHelper:147 - 字段“taakId”没有默认值
但是,taakid 字段确实有一个自动生成的值,所以我真的不明白我在这里做错了什么?另外,映射双方的多对多关系是不是不好?因为说实话,我不知道把它放在一侧或放在两侧有什么区别。 Mysql 确实创建了复合表,但没有在其中放入任何数据。
如果需要,这是我的测试代码:
public class TestMedewerker {
public static void main(String[] args) {
Medewerker m = new Medewerker("Jos", "Cameraman");
m.setFestival(new Festival("Rock Wercher", 3, "Werchter", 75000));
m.addTaak(new Taak("Filmen"));
m.addTaak(new Taak("Geluidsman Spelen"));
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
Transaction tx = session.beginTransaction();
session.saveOrUpdate(m);
tx.commit();
}
}
最佳答案
我有一个多对多关系的示例,请看一下并调整您的代码,我认为会起作用。
我有一张表 ST_Product 和 St_partner_subsidiary,还有一张表 ST_Product_subsidiary(其中一个外键指向 st_product,另一个外键指向 st_partner_subsidiary),所以我必须仅映射表 st_product 和 st_partner_subsidiary,然后我有:
@Entity
@Table(name = "ST_PRODUCT")
public class Product {
// OTHER columns
@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinTable(name = "ST_PRODUCT_SUBSIDIARY", joinColumns = {
@JoinColumn(
name = "PRODUCT_ID",
nullable = false,
updatable = false) },
inverseJoinColumns = { @JoinColumn(name = "PARTNER_SUBSIDIARY_ID",
nullable = false, updatable = false) })
public List<ProductSubsidiary> getProductSubsidiaries() {
return productSubsidiaries;
}
//Other columns
}
您不映射中间表,仅在两个实体中引用它,在这种情况下,您可以看到仅引用了 ST_PRODUCT_SUBSIDIARY。
希望有帮助。
关于java - 在 hibernate 状态下可连接多对多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19547456/