Training, Workshops, Softwareentwicklung

Hibernate Tutorial

Unidirektionales ManyToMany

Bei einer unidirektionalen ManyToMany Beziehung bildet man nur im Customer die Beziehung zu den Tags ab.

Das Datenbankschema sieht genau so aus, wie bei der bidirektionalen Variante:

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.

Im Tag taucht der Customer hier aber nicht auf:

Mapping Tag
@Entity
public class Tag {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "tag_gen")
    @SequenceGenerator(name = "tag_gen", sequenceName = "tag_seq", allocationSize = 1)
    private Long id;
    private String tag;
}
Test
doInHibernate(em -> {

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

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

    customer.getTags().add(tag);

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

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


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