Hibernate Anti-Patterns
J’ai eu l’occasion d’assiter à une conférence sur les anti-patterns Hibernate par Patricia Wegrzynowicz à Devoxx hier. Elle a mis en avant certains effets de bords induit par l’utilisation d’Hibernate (les points suivants peuvent souvent s’appliquer à d’autres ORM, rien de personnel avec Hibernate
. Cet article ne reprends qu’une partie du talk: les points que j’ai pu rencontrer en entreprise.
1. L’hydre
Hydra est une entité qui a la particularité de contenir une liste immuable de tête (heads.)
@Entity
public class Hydra {
private Long id;
private List heads = new ArrayList();
@Id @GeneratedValue
public Long getId() {...}
protected void setId() {...}
@OneToMany(cascade=CascadeType.ALL)
public List getHeads() {
return Collections.unmodifiableList(heads);
}
protected void setHeads(List heads) {...}
}
// creates and persists the hydra with 3 heads
// new EntityManager and new transaction
Hydra found = em.find(Hydra.class, hydra.getId());
La question est la suivante, combien d’appel sont fait en base de données lors de la deuxième transaction (créer lors de em.find).
(a) 1 select
(b) 2 selects
(c) 1+3 selects
(d) 2 selects, 1 delete, 3
inserts
(e) None of the above