Een entity graph gebruiken

Er zijn 2 technieken die we kunnen gebruiken voor een Entity Graph te maken:

  • Annotaties
  • Programmatisch

Voorbeeld opstelling:

We nemen het voorbeeld van de webshop, waar we klanten, producten, bestellingen en bestelling-lijnen hebben:
Customer, Product, ProductOrder & ProductOrderItem

Stel dat we een LAZY verbinding hebben tussen een bestelling en de klant.
Dankzij het fetch-type LAZY kunnen we de bestellingen opvragen zonder de info van de klant. Dit kan nuttig zijn voor het ophalen/voorbereiden van bestellingen in het magazijn.
Echter voor het opstellen van de factuur hebben we de gegevens van de klant nodig.

Programmatisch

emf = Persistence.createEntityManagerFactory("myPersistenceUnit");
em = emf.createEntityManager();
EntityGraph<ProductOrder> eg = em.createEntityGraph(ProductOrder.class);
eg.addAttributeNodes("customer"); // naam van de variabele in ProductOrder

Eerst maken we een instantie van de generieke klasse EntityGraph. Vervolgens verbinden we de relatie met naam “customer”, dit is de naam van de variabele in de klasse ProductOrder met als type Customer.

Annotaties

@NamedEntityGraph(name = "order-entity-graph-customer",
     attributeNodes = {@NamedAttributeNode("customer")}) // naam van de variabele in ProductOrder
@Entity
public class ProductOrder {
   ...
}

Deze Entity Graph kunnen we dan opvragen met de volgende code:

emf = Persistence.createEntityManagerFactory("myPersistenceUnit");
em = emf.createEntityManager();
EntityGraph eg = em.getEntityGraph("order-entity-graph-customer");

Zoeken met een entity graph

Bij een zoek operatie kunnen we een Entity Graph toevoegen.

Bij de methode find() geven we deze mee als een extra property van een Map<K, V>:

Map<String, Object> props = new HashMap<>();
props.put("javax.persistence.loadgraph", eg);
ProductOrder order = em.find(ProductOrder.class, 1L, props);

Voor de naam van de property hebben we twee mogelijkheden:

  1. javax.persistence.fetchgraph: Dit zal enkel de gegevens uit de Entity Graph inladen.
  2. javax.persistence.loadgraph: Dit zal alle gegevens uit de Entity Graph en alle gegevens waarvan het fetch-type EAGER is ingeladen worden.

De primary key en het versieveld voor optimistic locking worden altijd geladen.


Bij een query moeten we de Entity Graph meegeven als hint:

TypedQuery<ProductOrder> query = em.createQuery(SELECT o FROM ProductOrder as o", ProductOrder.class);
query.setHint("javax.persistence.fetchgraph", eg);
List<ProductOrder> orders = query.getResultList();

Opdracht:

Pas de voorgaande opdracht “contacts” aan zodat we gebruik maken van Entity Graphs om de verbinding tussen contacten en contact-groepen bij het ophalen van de gegevens.