2011-11-19 74 views
1

爲了更熟悉新的Java EE 6系統,我創建了一個小型演示應用程序,該應用程序應該能夠將一些用戶輸入存儲在postgres數據庫中。OpenJPA無法在Postgres DB中創建/插入表格

我使用:
- 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; 
} 

感謝您的幫助。

回答

2

也許'用戶'是postgres上的保留關鍵字?你可以嘗試指定你的實體的名稱是User0或什麼的?

+0

它工作。謝謝瑞克:-) –