Чтобы лучше познакомиться с новой системой Java EE 6, я создал небольшое демонстрационное приложение, которое должно иметь возможность сохранять некоторый пользовательский ввод в базе данных postgres.
Я использую:
- Glassfish 3.1
- Postgres 9.1
- OpenJPA 2.1.1
Для этой цели я написал следующую сущность:
@Entity
public class User implements Serializable
{
@Id
@GeneratedValue(generator="user_seq",strategy=GenerationType.SEQUENCE)
@SequenceGenerator(name="user_seq", sequenceName="user_seq",allocationSize=1)
public Long id;
База данных полностью пуста, а пул соединений настроен в Glassfish. Мой файл persistence.xml выглядит так:
<persistence-unit name="myDatabase" transaction-type="JTA" >
<provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
<jta-data-source>jdbc/myDatabase</jta-data-source>
<properties>
<property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema" />
<property name="openjpa.jdbc.DBDictionary" value="postgres" />
</properties>
</persistence-unit>
В связи с тем, что я не хочу сам вставлять все db-объекты, я активировал автоматическое создание схемы в свойствах jpa. При первом запуске openjpa (или, возможно, postgre) создает новую последовательность с именем «user_seq», как указано в аннотациях объекта. Это прекрасно работает. Но затем openjpa хочет создать таблицу «пользователь» и выдает следующее исключение:
Caused by: org.apache.openjpa.lib.jdbc.ReportingSQLException:
FEHLER: Syntaxfehler bei »User«
Position: 14 {stmnt 31631786 CREATE TABLE User
(id BIGINT NOT NULL, userlastlogin VARCHAR(255), username VARCHAR(255),
userpassword VARCHAR(255), PRIMARY KEY (id))} [code=0, state=42601]
SQL-утверждение, кажется, в порядке. Если я сам создам таблицу «пользователь», я получу ReportingSQLException, что openjpa не может вставить объект в существующую таблицу.
Сначала я подумал, что и openjpa, и postgre хотят создать последовательность с активированным созданием схемы. Поэтому изменил свойство на:
<property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(Sequences=false)" />
К сожалению, это тоже не сработало.
Что еще я могу сказать.. Хм.. Мой DAO выглядит так:
@Stateless
public class DAOService
{
@PersistenceContext
protected EntityManager em;
public <T> T create(T t)
{
this.em.persist(t);
this.em.flush();
this.em.refresh(t);
return t;
}
Спасибо за вашу помощь.