Я использую 2 PU в EJB не сохраняющем состояние, и каждый из них вызывается на один метод:
@PersistenceContext(unitName="PU")
private EntityManager em;
@PersistenceContext(unitName="PU2")
private EntityManager em2;
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW )
public void getCandidates(final Integer eventId) throws ControllerException {
ElectionEvent electionEvent = em.find(ElectionEvent.class, eventId);
...
Person person = getPerson(candidate.getLogin());
...
}
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW )
private Person getPerson(String login) throws ControllerException {
Person person = em2.find(Person.class, login);
return person;
}
Те методы аннотируются транзакцией REQUIRES_NEW для предотвращения этого исключения. Когда я называл их методом от javaFX апплета, все работали как ожидалось. Теперь я пытаюсь назвать их от веб-сервиса JAX-RS (я не вижу логического различия, поскольку в обоих случаях ejb искался в начальном контексте), и я продолжаю получать это исключение. Когда я настроил XADatasource в пулах соединения glassfish 2.1, я получил nullpointer исключение на em2.
Какие-либо идеи, что попробовать затем?
С уважением
Хорошо,
теперь решено. Я поделюсь на случай, если кто-то столкнется с подобной проблемой. Вся проблема была в развертывании netbeans. Они перезаписывают настройки в пуле соединений Glassfish, и когда вы устанавливаете их правильно во время выполнения, вы получаете глупые вещи npe или отсутствующий пароль. Место для редактирования - sun-resources.xml . Элемент XML имеет атрибуты datasource-classname и rs-type. Что нужно сделать в случае базы данных Derby:
<jdbc-connection-pool ...
datasource-classname="org.apache.derby.jdbc.ClientXADataSource"
res-type="javax.sql.XADataSource">
...
</jdbc-connection-pool>
Теперь работает как шарм.
Я использую 2 PU в EJB без сохранения состояния, и каждый из них вызывается одним методом
Действительно. Но вы вызываете второй метод из первого, поэтому вы выполняете распределенную транзакцию, и вам нужно использовать для этого XA (по крайней мере, для одного из ресурсов, поскольку GlassFish поддерживает последнюю оптимизацию агента , позволяющую чтобы задействовать один не-XA-ресурс). Другими словами, установка одного из ваших источников данных в качестве XADataSource
- это правильный путь.
Если при этом вы получите сообщение об ошибке, добавьте подробные сведения о том, что вы сделали , а именно и трассировку стека.