Question

So I have a manytomany relationship between two entities, Medewerker and Taak, here's the code I have for both:

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

Now, I want to have the middle table (T_MEDEWERKER_TAAK) to be automatically generated with hibernate through jointable. However, I keep getting the following error : 21:49:08,157 WARN SqlExceptionHelper:145 - SQL Error: 1364, SQLState: HY000 21:49:08,158 ERROR SqlExceptionHelper:147 - Field 'taakId' doesn't have a default value

However, taakid field does have an automatically generated value, so I don't really see what I'm doing wrong here? Also, is it bad to map the manytomany relationship on both sides? Because well too be honest I have no idea what the difference is between putting it on one side or putting it on both sides.. Mysql does create the composite table, but doesn't put any data inside.

If needed, here is my 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();
}
}
Était-ce utile?

La solution

I have an example for manytomany relationships take a look and adapt your code to this and I'll think will work.

I have a table ST_Product and St_partner_subsidiary and I have a table ST_Product_subsidiary(which holds one foreign key to st_product and other to st_partner_subsidiary) so I have to map only the tables st_product and st_partner_subsidiary and then I have:

@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
}

You don't map the middle table, you only refer to it in the two Entities in this case you can see ST_PRODUCT_SUBSIDIARY is only refered.

Hope it helps.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top