2010-03-16 5 views
2

Код «HelloJPA» (ниже) пытается хранить сотрудника в хранилище данных. Однако, любая попытка чтения сохраненное объект после совершения (ресурсов местного) сделки вознаграждается с «IllegalStateException»:Начинающий вопрос: базовая идиома ввода для JPA?

Employee employee = ... 
EntityManagerFactory factory = 
    Persistence.createEntityManagerFactory("HelloJPA", System.getProperties()); 
EntityManager manager = factory.createEntityManager(); 
EntityTransaction transaction = manager.getTransaction(); 
try { 
    transaction.begin(); 
    manager.persist(employee); 
    transaction.commit(); 
} finally { 
    if (transaction.isActive()) { 
     transaction.rollback(); 
    } 
    manager.close(); 
} 
System.out.println("Employee id == " + employee.getId()); //<< IllegalStateException 

ОК, я думаю, менеджер овладела моего нового распределённая объекта сотрудника и ему когда я совершил транзакцию, стал недоступен. Но тогда, какова общая идиома для реализации этой простой операции, то есть записи объекта до хранилища данных, сохраняя при этом доступ только для чтения? Документация (руководства или ссылки на API) не затрагивает это специально, и образцы кода, которые я нашел, которые используют локальные транзакции ресурсов, никогда, кажется, не пытаются прочитать объект после совершения ... Но, безусловно, должно быть просто тривиально простым способом сделать это??

Заранее благодарю за помощь/указатели!

+0

Во-первых, действительно ли созданный сотрудник фактически сохранялся в БД? Во-вторых, как выглядит ваш сотрудник Entity? Использование объекта после того, как локальная транзакция ресурса будет действительной, нужно сделать. – Rick

+0

Эй, Рик, спасибо за ваш комментарий. Yup, сотрудник добавляется в хранилище данных. Конечно, это пример игрушки, так что «работник» выглядит неизлечимо упрощенно: @Entity класс Сотрудник общественного реализует Serializable { частных статический окончательный длинный serialVersionUID = ...; @Id private String id; @Basic приватное название строки; @Basic частное положение строки; // Геттеры и сеттеры опущены Помогает ли это? Заранее спасибо! – jucar

+0

Не могли бы вы опубликовать IllegalStateException? Рик прав, это должно сработать. – Mike

ответ

0

Ваш employee отсоединяется после закрытия диспетчера объектов, но нет ничего, что запрещает доступ к аннотированному объектуотделимого объекта. IOW, ваш код верен и работает с Hibernate и EclipseLink. Может быть, искать в Jira OpenJPA для существующей проблемы или открыть новую.

Смежные вопросы