为了更熟悉新的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;
}
感谢您的帮助。
答案 0 :(得分:2)
也许'用户'是postgres上的保留关键字?您可以尝试将您的实体名称指定为User0或其他内容吗?