2013-04-16 2 views
1

Я пытаюсь разработать простое веб-приложение на основе JSP с JPA и хотел бы знать правильное использование для его разработки.Правильное использование JPA в приложении jsp

В моем примере приложения у меня есть две страницы JSP и простой Java-класс для выполнения операций с базой данных. Оба файла JSP используют этот Java-класс для выполнения операций с БД.

Я аннотированный этот класс @Stateless и впрыскивается менеджер Entity следующим образом:

@PersistenceContext(unitName = "myjpa") 
EntityManager em; 

В моих persistence.xml я установил следующее свойство:

<property 
    name="hibernate.transaction.jta.platform" 
    value="org.hibernate.service.jta.platform.internal.JBossAppServerJtaPlatform" 
/> 

Я звоню класса в JSP с использованием JNDI (поскольку класс аннотируется для сессионного компонента без состояния) следующим образом:

InitialContext ic = new InitialContext(); 

Sample sample = (Sample) ic.lookup("java:app/" + application.getContextPath() + "/Sample"); 

Я столкнулся следующие сценарии:

  1. Когда я пытаюсь использовать транзакцию em.getTransaction().begin()/commit() для вставки и обновления, он говорит, что не может использовать сделку с футляром JTA.

  2. Таким образом, в конструктор кода моего класса Java Я использую следующий код:

Properties properties = new Properties(); 

properties.put("javax.persistence.transactionType", "RESOURCE_LOCAL"); 

emf = Persistence.createEntityManagerFactory("myjpa",properties); 

em = emf.createEntityManager(); 

Я пытался использовать транзакции, как em.getTransaction().begin()/commit(). Но в этом случае страницы становятся медленнее после 2-3 обновлений базы данных и операций загрузки. Хотя я не получаю никаких исключений. В целом в моем столе у ​​меня меньше 25 записей.

Мне кажется, что он ждет внутренне, чтобы выполнить некоторую операцию.

В то же время я также чувствую, что то, как я использую JPA, является неправильным и, следовательно, выпрашивает совет для правильного подхода для выполнения даже простых веб-приложений с JSP и JPA.

Хотя я все еще изучаю Java EE, в случае, если у вас есть какая-то конкретная ссылка для таких случаев, я тоже буду читать и просматривать их.

+0

Вы не должны делать упорство внутри JSP, особенно если вы используете правильное приложение EE. Любая причина, по которой у вас нет компонентов для предоставления этой функции? –

+0

Я пытаюсь развить простые вещи, чтобы понять вещи. в этом случае я выполняю упорство в моем классе java-класса без состояния. Просто, что я называю этот bean-компонент в jsp. Внутри jsp нет прямой операции persistence/db. Все вызовы db проходят через bean-класс. – user1050134

ответ

1

Вы всегда должны стремиться использовать транзакции JTA, что означает, что контейнер будет обрабатывать демаркации транзакций. В вашем случае, если вы хотите обрабатывать транзакции самостоятельно, вам нужно определить его как транзакцию, управляемую компонентом. Итак, в классе EJB после @Stateless annoattions вы должны определить следующую аннотацию;

@TransactionManagement(TransactionManagementType.BEAN) 

Обычным Лучше всего, чтобы контейнер обрабатывать транзакции, если нет какой-то явной причины для того, чтобы использовать Bean транзакции, управляемые.

+0

Я согласен с тем, что позволить контейнеру обрабатывать транзакцию лучше. Я добавил транзакции, поскольку изменения в базе данных не отражались. И я, хотя это может быть из-за того, что транзакции db не совершаются. После добавления кода транзакции и связанных с ним изменений кода изменения db получают отражение. Но приложение работает медленно. Может быть, я должен потратить время на то, почему с простой опцией JTA БД не отражает изменений. – user1050134

1

В то же время я чувствую, что путь я использую JPA неправильно

Ваше использование действительно кажется неправильным. Если вы используете сессионный компонент (без состояния), вам не нужно возиться с em.getTransaction().begin()/commit(), и вам определенно не нужно использовать код, например Persistence.createEntityManagerFactory.

Вам также не нужно устанавливать свойство org.hibernate.service.jta.platform.internal.JBossAppServerJtaPlatform.

Абонентский компонент автоматически управляет транзакцией для вас, и в рамках Java EE AS ​​(например, JBoss AS) вам не нужно настраивать диспетчер транзакций или подобные вещи.

Пример:

@Stateless 
public class UserDAO { 

    @PersistenceContext 
    private EntityManager entityManager; 

    public void add(User user) { 
     entityManager.persist(user); 
    } 
} 

Что касается файла persistence.xml, что-то вроде следующего должно быть достаточно, чтобы начать:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.0" 
    xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> 

    <persistence-unit name="somePU"> 
     <jta-data-source>java:app/someDS</jta-data-source> 
    </persistence-unit> 
</persistence> 

еще несколько примеров:

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