0

因此,我在两个实体 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)通过可连接的休眠自动生成。但是,我不断收到以下错误:21:49:08,157 WARN 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();
}
}
4

1 回答 1

0

我有一个多对多关系的例子,看看并调整你的代码,我认为会起作用。

我有一个表 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 仅被引用。

希望能帮助到你。

于 2013-10-23T17:09:05.217 回答