Как правильно использовать LocalContainerEntityManagerFactoryBean с JPA

Я загрузил пример приложения, использующего Hibernate и JPA, проблема заключается в блоке сохранения. Кажется, я могу использовать либо <persistence-unit name="hibernatePersistenceUnit" transaction-type="RESOURCE_LOCAL">, либо <persistence-unit name="hibernatePersistenceUnit" transaction-type="JTA">. Из моего исследования я обнаружил, что если я использую первое, мне также нужно указать <non-jta-data-source>, а со вторым <jta-data-source> (я думаю, что это правильно, но поправьте меня, если я ошибаюсь)

Я думаю, что первый подразумевает, что URL, драйвер, пользователь, pwd будут настроены в веб-приложении. А второй будет искать источник через JNDI в контейнере (опять же поправьте меня, если я не прав) Но значение, которое мне нужно указать для этого свойства, является моим камнем преткновения. Я видел jdbc:sampleDS, java:sampleDS. (Это тоже поиск jndi? Не видел jndi:sampleDS) Так должен ли это быть jdbc: или java: или jndi: и все ли это «JNDI»?

А «sampleDS», к чему на самом деле относится это имя? Другими словами, относится ли это к имени bean-компонента (я использую spring, и мой bean-компонент, который настраивает информацию об источнике данных, называется jpaDataSource), если я использую resource_local, или он ссылается на ресурс jndi где-то на сервере приложений, например, JBOSS, или что-то еще, чего я не знаю?


person alex sundukovskiy    schedule 17.02.2012    source источник
comment
Без обид, но это непостижимо на многих уровнях. Возможно, вы могли бы сосредоточиться на том, чтобы задать один конкретный вопрос.   -  person MaDa    schedule 17.02.2012
comment
МаДа, вы правы, мой плохой код, который я вставил, не отобразился. Я отредактирую пост.   -  person alex sundukovskiy    schedule 21.02.2012


Ответы (1)


RESOURCE_LOCAL вы используете, если вам не нужны глобальные транзакции (транзакции, охватывающие несколько единиц хранения, т. е. базы данных) или источники данных, определенные JNDI, если вам нужны глобальные транзакции, вы должны использовать JTA, который, в свою очередь, требует, чтобы вы использовали источники данных JNDI, поскольку они находятся на сервере приложений. который может обрабатывать глобальные транзакции.

Источники данных JNDI настраиваются на сервере приложений — в случае JBOSS либо в файле configuration/standalone.xml, либо с файлами *-ds.xml в папке развертываний.

java:sampleDS — это имя JNDI, пример файла mssql-ds.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<datasources>
  <datasource jndi-name="java:jboss/datasources/myDatabase" pool-name="myDatabase" enabled="true" jta="true" use-java-context="true" use-ccm="true">
    <connection-url>
        jdbc:sqlserver://localhost;databaseName=myDatabase
    </connection-url>
    <driver>
        sqljdbc
    </driver>
    <security>
        <user-name>
            myusername
        </user-name>
        <password>
            mypassword
        </password>
    </security>
  </datasource>
<datasources>
person Vedran    schedule 10.10.2012