Training, Workshops, Softwareentwicklung

Hibernate Tutorial

Unidirektionales OneToOne

Bei einer unidirektionalen OneToOne Beziehung bildet man nur im Customer die Beziehung zur Registration ab.

Wichtig ist hier, dass der Fremdschlüssel im Customer abgebildet wird.

Das Datenbankschema sieht dann so aus:

06 08 dbschema

Das unidirektionale Mapping in den Entities sieht so aus:

Mapping Customer
@Entity
public class Customer {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "cust_gen")
    @SequenceGenerator(name = "cust_gen", sequenceName = "customer_seq", allocationSize = 1)
    private Long id;
    // getter / setter omitted
    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY) (1)
    @JoinColumn(name = "registration_id") (2)
    private Registration registration;
1 Wir müssen LAZY hier angeben, da die Default-Einstellung EAGER wäre.
2 Die @JoinColumn ist diesmal in der Customer Tabelle!

Registration

Die Registration ist dann unauffällig:

Mapping Registration
@Entity
public class Registration {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "reg_gen")
    @SequenceGenerator(name = "reg_gen", sequenceName = "registration_seq",
            allocationSize = 1)
    private Long id;
    private String registrationNo;
}

Auch hier haben wir durch das Lazy Loading eventuell ein n+1 Select Problem:

Test
doInHibernate(em -> {

    TypedQuery<Customer> query = em.createQuery("SELECT c FROM Customer c", Customer.class);
    Customer customer = query.getSingleResult();

    Registration registration = customer.getRegistration(); (1)

    assertEquals("1234", registration.getRegistrationNo());
});

assertSelectCount(2); (2)
1 Beim Zugriff auf die Registration erfolgt ein zusätzlicher Datenbankzugriff
2 Wir sehen zwei Selects!