OpenJPA无法在Postgres DB中创建/插入表

时间:2011-11-19 14:48:27

标签: postgresql java-ee-6 glassfish-3 openjpa

为了更熟悉新的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>

由于我不想自己插入所有数据库对象,我在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-Statement似乎没问题。如果我自己创建表'user',我会得到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;
}

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

也许'用户'是postgres上的保留关键字?您可以尝试将您的实体名称指定为User0或其他内容吗?