Лучший способ сделать доступ к базе данных в настольном приложении Java - PullRequest
2 голосов
/ 28 января 2011

Я работал в Glassfish 3, JPA и Java EE 6. В веб-контейнере вы можете просто внедрить Entity Manager в EJB и позволить ему обрабатывать ваши транзакции, откаты и т. Д. Что мне делать на рабочем столеприложение.Очевидно, что это не работает.Я знаю, что все еще использовал бы JPA для ORM.Но я бы создал EntityMangerFactory, а затем создать Entitymanager из этого?Должен ли я обрабатывать транзакции вручную?Было бы здорово, если бы я мог увидеть некоторые примеры приложений.Спасибо!

Ответы [ 5 ]

3 голосов
/ 28 января 2011
EntityManagerFactory entityManagerFactory = 
     Persistence.createEntityManagerFactory("DS");
em = entityManagerFactory.createEntityManager();

Вы должны обрабатывать транзакции, вызывая em.getTransaction.begin() и em.getTransaction.commit(), если вы не используете spring-framework или что-то еще.

2 голосов
/ 28 января 2011

Вы можете использовать Spring, это принесет вам приятное знакомство с JEE6 для настольных приложений. (Конечно, это не на 100% то же самое!)

2 голосов
/ 28 января 2011

Ну, я предлагаю попробовать использовать Spring + JPA, там вам не нужен контейнер, это просто контекст приложения, и вы можете настраивать транзакции там.Вы не будете заботиться о транзакциях, просто укажите свои методы, которые вы хотите использовать как @ Transactional.

1 голос
/ 28 января 2011

Я построил 2-уровневый клиент Java Swing с использованием Hibernate и Swing, и я никогда не буду делать это снова.Если бы мне пришлось перестраивать его сегодня, я бы использовал необработанные JDBC-запросы или, может быть, очень тонкую структуру отображения ORM, такую ​​как iBatis.

Причина, по которой Hibernate (и я предполагаю другие реализации JPA, хотя мой опыт только сHibernate) настолько отличается в среде рабочего стола, что 1), поскольку объекты, как правило, имеют гораздо более длительный срок службы на рабочем столе, и 2) очень трудно понять, когда к объекту будет осуществлен доступ, поэтому правильная обработка транзакций для отложенной загрузки проблематична.

Парадигма веб-запроса-ответа принципиально транзакционна, поэтому там очень легко разграничить ваши транзакции.На рабочем столе каждое нажатие клавиши, даже просто MouseMovedEvent, потенциально может вызвать запрос к базе данных или ленивую загрузку, поэтому намного сложнее узнать, когда инициировать и фиксировать транзакции.

Обработка ошибок и обновление объектов - большая проблема, поскольку объекты, как правило, имеют гораздо более длительный срок службы (часто на время запуска приложения).В Hibernate исключения не подлежат восстановлению, что означает, что вы должны перезагрузить все из БД.Это хорошо в Интернете, но определенно не очень хорошо, когда у вас есть тысячи объектов, встроенных в различные модели в вашем графическом интерфейсе.

1 голос
/ 28 января 2011

Другим вариантом может быть использование так называемого Embeddable EJB Container .Он может предоставить вам те же услуги, что и инъекция, CMT и т. Д., К которым вы, возможно, привыкли.

...