OpenJPA не может создать / вставить таблицу в Postgres DB - PullRequest
1 голос
/ 19 ноября 2011

Чтобы лучше ознакомиться с новой системой Java EE 6, я создал небольшое демонстрационное приложение, которое должно сохранять некоторые пользовательские данные в базе данных postgres.

Я использую:
- стеклянная рыба 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 хочет создать таблицу 'user' и выдает следующее исключение:

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-оператор в порядке. Если я сам создаю таблицу «пользователь», я получаю исключение ReportingSQLEx, что 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;
}

Спасибо за вашу помощь.

1 Ответ

2 голосов
/ 19 ноября 2011

Возможно, «Пользователь» является зарезервированным ключевым словом в postgres? Можете ли вы попробовать указать название вашей организации как User0 или что-то еще?

...