Training, Workshops, Softwareentwicklung

Hibernate Tutorial

Read-Only Cache

Sind wir sicher, dass an einer Tabelle überhaupt keine Änderungen vorgenommen werden, so kann man im Read-Only Modus zusätzlich auch noch das Setzen der "Ungültig"-Markierung einsparen.

Read-Only
@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_ONLY)
public class Customer {
    @Id
    private Long id;
    private String firstname;
    private String lastname;

Interessant ist, dass es durchaus erlaubt ist, neue Datensätze anzulegen oder welche zu löschen:

Insert und Delete is erlaubt
Customer c = new Customer();
c.setId(2L);
c.setFirstname("Alice");
c.setLastname("Rogers");

doInHibernate(em -> withTransaction(em, () -> em.persist(c)));

for (int i = 0; i < 5; i++) {
    doInHibernate(em -> {
        Customer customer = em.find(Customer.class, 2L);
        assertNotNull(customer);
        assertEquals("Alice", customer.getFirstname());
    });
}

doInHibernate(em -> {
    Customer proxy = em.getReference(Customer.class, 2L);
    withTransaction(em, () -> em.remove(proxy));
});

doInHibernate(em -> {
    Customer customer = em.find(Customer.class, 2L);
    assertNull(customer);
});
assertSelectCount(1);

Eher unerwartet ist das Verhalten, wenn man ein Update versucht: Updates führen zwar zu einer Warnung, werden ansonsten aber einfach ignoriert.

Updates werden ignoriert
doInHibernate(em -> {
    Customer customer = em.find(Customer.class, 1L);

    assertNotNull(customer);
    assertEquals("Buck", customer.getFirstname());
    withTransaction(em, () -> customer.setFirstname("Alice"));

    Customer customer2 = em.find(Customer.class, 1L);

    assertNotNull(customer2);
    // It did not update!! We had no Exception!
    assertEquals("Buck", customer2.getFirstname());
    assertSelectCount(2);
});