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
- 460