ORM

Co to je?

  • Mechanismus umožňující "automaticky" mapovat databázová data na Objekty v aplikaci

JPA x Hibernate

  • JPA - Java Persistent API
  • jedna z implemetancí hibernate

Hibernate

  • entityManager - zajišťuje práci mezi DB a aplikací
  • properties:
    • hbm2dll - co bude dělat hibernate s DB - validate
    • schema - schema do ktereho se ma připojit
    • dialect - podle DB (org.hibernate.dialect.PostgreSQLDialect)
    • show_sql - zda se v logu zobrazí vygenerované sql
  • transactionManager - má na starosti řízení transakcí

Hibernate - transakce

  • zajišťují atomické provedení operace
  • metody/třídy anotujeme @Transaction
public interface PersonService {

    Person getUser(Integer id);

    void addUser(Person person);

    @Transactional
    void updateUserName(String name);
}

Hibernate - entita

  • třída anotovaná @Entity a @Table
  • musí mít @Id
    • v případě postgres musí mít určenou sequenci pro generování id
  • sloupce jsou anotovány @Column
@Entity
@Table(name = "person")
public class Person {

    @Id
    @SequenceGenerator(name = "person_id_seq", 
        sequenceName = "person_id_seq", allocationSize = 1)
    @GeneratedValue(generator = "person_id_seq", strategy = GenerationType.SEQUENCE)
    private Integer id;

    @Column(name = "name")
    private String name;

Hibernate - entita

  • může obsahovat kolekci jiných entit
  • anotujeme podle kardilnality:
    • @OneToOne
    • @OneToMany
    • @ManyToMany
  • + @JoinColumn/@JoinTable - podle způsobu propojení
@OneToMany()
@JoinColumn(name = "company_id")
private List<Person> personList;

Hibernate - entita

  • načítání kolekcí probíhá:
    • lazy(deafult) - do kolekce se vyplní pouze proxy a objekty se dočtou z DB až když jsou potřeba !funguje jen uvnitř transakce!
    • eager - načte se vče hned
@OneToMany(fetch = FetchType.EAGER)
@JoinColumn(name = "company_id")
private List<Person> personList;

Hibernate - repository

  • vytváříme pomocí spring-data
  • píšeme pouze interface a dědíme ho z JpaRepository
  • metody fungují dle jména "findBy", "orderByXXAsc"
  • můžeme psát vlastní pomocí @Query
  • modifikační (update/delete) musí být označeny @Modifying
public interface PersonRepository extends JpaRepository<Person, Integer> {

    Person findById(Integer id);

    @Modifying
    @Query("update Person p set p.name = :name where p.id = :id")
    void updatePersonName(@Param("name") String name, @Param("id") Integer id);
 

Hibernate - CV

Hibernate - CV

  • vytvořte webovou aplikace pomocí SpringMvc
  • bude pracovat s objektem Company{id, name, List<Employ>}
  • a Employ{id, name, email}
  • aplikace bude umět:
    • pomocí formuláře přidat company i employ
    • vypsat employ company se všemy employ

ORM

By Jiří Čížek

ORM

  • 456