2013-10-23 135 views
0

所以我有两个实体,Medewerker和Taak之间的多对多关系,这里我有两个密码:Jointable多对多休眠

@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)通过jointable自动生成休眠。但是,我不断收到以下错误: 21:49:08,157 WARN SqlExceptionHelper:145 - SQL错误:1364,SQLState:HY000 21:49:08,158错误SqlExceptionHelper:147 - 字段'taakId'没有默认值

但是,taakid字段确实有一个自动生成的值,所以我真的不明白我在这里做错了什么?另外,映射双方的多方关系还不好吗?因为老实说,我不知道把它放在一边或把它放在两边之间有什么区别.. Mysql确实创建了复合表,但并没有放入任何数据。

如果需要的话,这是我testcode:

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(); 
} 
} 

回答

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仅被引用。

希望它有帮助。

+0

我想我和你一样,两个@JoinColumn名称属性就是你给自己的名字吗? (他们不是指任何外键或什么?) –

+0

我修好了!我愚蠢地在两个引用彼此的表中都有外键 –