Совместно многие ко многим в спящем режиме

Таким образом, у меня есть многозначные отношения между двумя сущностями, 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();
}
}

person Robin-Hoodie    schedule 23.10.2013    source источник


Ответы (1)


У меня есть пример для многих отношений, взгляните и адаптируйте свой код к этому, и я думаю, что это сработает.

У меня есть таблица 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 упоминается только.

Надеюсь, поможет.

person Bruno    schedule 23.10.2013
comment
Я думаю, что делаю то же самое, что и вы, два атрибута имени @JoinColumn - это то имя, которое вы сами им даете, верно? (Они не имеют в виду какие-либо внешние ключи или что-то еще?) - person Robin-Hoodie; 23.10.2013
comment
Я починил это! У меня по глупости были внешние ключи в обеих таблицах, которые ссылались друг на друга - person Robin-Hoodie; 24.10.2013