Training, Workshops, Softwareentwicklung

Hibernate Tutorial

Bidirektionales ManyToMany

Für dieses Beispiel wollen wir unserem Customer Tags zuordnen.

Bei einer bidirektionalen ManyToMany Beziehung bildet man sowohl im Customer die Beziehung zu den Tags ab, als auch umgekehrt die Beziehung von den Tags zum Customer.

Das Datenbankschema sieht dann zum Beispiel so aus:

06 06 dbschema

Das bidirektionale Mapping in den Entities sieht so aus:

Mapping Customer
@ManyToMany
@JoinTable(name = "CUSTOMER_TAG", (1)
        joinColumns = @JoinColumn(name = "CUSTOMER_ID"),
        inverseJoinColumns = @JoinColumn(name = "TAG_ID"))
private Set<Tag> tags = new HashSet<>();
1 Mit @JoinTable legen wir die Struktur der Zwischentabelle fest.
Mapping Tag
@ManyToMany(mappedBy = "tags") (1)
private Set<Customer> customers = new HashSet<>();
1 Das mappedBy macht die andere Seite der Beziehung zum Owner
Test
doInHibernate(em -> {

    Customer customer = new Customer();
    customer.setFirstname("Buck");
    customer.setLastname("Rogers");

    Tag tag = new Tag();
    tag.setTag("1234");

    customer.getTags().add(tag);
    tag.getCustomers().add(customer);

    withTransaction(em, () -> {
        em.persist(tag);
        em.persist(customer);
    });

    withTransaction(em, () -> {
        customer.getTags().clear();
        tag.getCustomers().clear();
        em.remove(customer);
        em.remove(tag);
    });
});


assertSelectCount(0);
assertInsertCount(3); (1)
assertUpdateCount(0);
assertDeleteCount(3);
1 Wir sehen jetzt drei Datenbankzugriffe, da auch die Zwischentabelle geschrieben werden muss