
pdf / 3-jpa
.pdf
Entity Listeners and Callback
Methods
●Используются для получения lifecycle events
●Default entity listeners – могут быть определенны в XML файле для всех entities
●Entity listeners не имеют состояния их жизненный цикл не определен
●Могут выбрасывать RuntimeException (вызовит откат транзакции)
●Могут вызывать JNDI, JDBC, JMS, Session EJB
●Не должны вызывать EntityManager или Query операции или модифицировать ассоциации
●Callback методы могут быть public, private, protected, or package level access, но не static or final

Callback Methods
●Внутри Entity: void <METHOD>()
●Внутри listener class: void <METHOD>(Object)
●Возможные аннотации:
–PrePersist
–PostPersist
–PreRemove
–PostRemove
–PreUpdate
–PostUpdate
–PostLoad

@Entity
@EntityListeners(AlertMonitor.class) public class Account {
...
@PostLoad
protected void adjustPreferredStatus() {
preferred = (getBalance() >= am.getPreferredStatusLevel());
}
}
public class AlertMonitor { @PostPersist
public void newAccountAlert(Account acct) { Alerts.sendInfo(acct.getAccountId(), acct.getBalance());
}
}

Исключения
●PersistenceException - базовый класс
●TransactionRequiredException
●OptimisticLockException
●RollbackException
●EntityExistsException — persist
●EntityNotFoundException -refresh(), getReference()
●NoResultException — Query.getSingleResult() не вызывает откат
●NonUniqueResultException -Query.getSingleResult() не вызывает откат

Query Interface
●List getResultList()
●Object getSingleResult()
●int executeUpdate()
●Query setMaxResults(int maxResult)
●Query setFirstResult(int startPosition)
●Query setHint(String hintName, Object value)
●Query setParameter(...)
●Query setFlushMode(FlushModeType flushMode); FlushModeType:
–AUTO
–COMMIT

Named Queries
@NamedQuery(
name="findAllWithName",
query="SELECT c FROM Customer c WHERE c.name LIKE :custName")
//----------------------
@PersistenceContext public EntityManager em;
...
em.createNamedQuery("findAllWithName")
.setParameter("custName", "Smith")
.getResultList();

SQL Native Queries
Query q = em.createNativeQuery(
"SELECT o.* FROM Order o, Item i WHERE o.item = i.id AND " + "i.name = ‘widget’", Order.class);
@SqlResultSetMapping(name="WidgetOrderResults", entities=@EntityResult(entityClass=Order.class)) Query q = em.createNativeQuery(
"SELECT o.* FROM Order o, Item i WHERE o.item = i.id AND " + "i.name = ‘widget’", "WidgetOrderResults");
@SqlResultSetMapping(name="OrderItemResults",
entities={@EntityResult(entityClass=Order.class),
@EntityResult(entityClass=Item.class)}) Query q = em.createNativeQuery(
"SELECT * FROM Order o, Item i WHERE o.item = i.id AND " + "i.name = ‘widget’", "OrderItemResults");

SQL Native Queries
Query q = em.createNativeQuery(
"SELECT o.id AS order_id, o.quantity AS order_quantity, " + "o.item AS order_item, i.name AS item_name, " +
"FROM Order o, Item i " +
"WHERE (order_quantity > 25) AND (order_item = i.id)", "OrderResults");
@SqlResultSetMapping(name="OrderResults", entities={@EntityResult(entityClass=com.acme.Order.class, fields={ @FieldResult(name="id", column="order_id"), @FieldResult(name="quantity", column="order_quantity"), @FieldResult(name="item", column="order_item")})}, columns={@ColumnResult(name="item_name")})