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