Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

pdf / 3-jpa

.pdf
Скачиваний:
43
Добавлен:
06.06.2015
Размер:
170.47 Кб
Скачать

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")})

Соседние файлы в папке pdf