2014-07-05 87 views
0

你好,我一直在試圖堅持jpa實體類到sql server 2008 R2數據庫。但我遇到了一些問題。我現在發佈的問題已經在堆棧溢出,但其未解決Jpa實現eclipse鏈接與sql server 2008R2

[EL Info]: 2014-07-05 21:06:30.965--ServerSession(2052069)--EclipseLink, version: Eclipse Persistence Services - 2.5.0.v20130507-3faac2b 
[EL Info]: connection: 2014-07-05 21:06:37.337--ServerSession(2052069)--file:/D:/eclipse/workspace/JpaExamples/build/classes/_User login successful 
[EL Warning]: 2014-07-05 21:06:39.741--ServerSession(2052069)--Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.DatabaseException 
Internal Exception: com.microsoft.sqlserver.jdbc.SQLServerException: Incorrect syntax near the keyword 'USER'. 
Error Code: 156 
Call: CREATE TABLE USER (ID INTEGER IDENTITY NOT NULL, LOGIN VARCHAR(255) NULL, NAME VARCHAR(255) NULL, PASSWORD VARCHAR(255) NULL, PRIMARY KEY (ID)) 
Query: DataModifyQuery(sql="CREATE TABLE USER (ID INTEGER IDENTITY NOT NULL, LOGIN VARCHAR(255) NULL, NAME VARCHAR(255) NULL, PASSWORD VARCHAR(255) NULL, PRIMARY KEY (ID))") 
[EL Warning]: 2014-07-05 21:06:40.192--UnitOfWork(20389947)--Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.DatabaseException 
Internal Exception: com.microsoft.sqlserver.jdbc.SQLServerException: Incorrect syntax near the keyword 'USER'. 
Error Code: 156 
Call: INSERT INTO USER (LOGIN, NAME, PASSWORD) VALUES (?, ?, ?) 
    bind => [3 parameters bound] 
Query: InsertObjectQuery([email protected]) 
Exception in thread "main" javax.persistence.RollbackException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.DatabaseException 
Internal Exception: com.microsoft.sqlserver.jdbc.SQLServerException: Incorrect syntax near the keyword 'USER'. 
Error Code: 156 
Call: INSERT INTO USER (LOGIN, NAME, PASSWORD) VALUES (?, ?, ?) 
    bind => [3 parameters bound] 
Query: InsertObjectQuery([email protected]) 
    at org.eclipse.persistence.internal.jpa.transaction.EntityTransactionImpl.commit(EntityTransactionImpl.java:157) 
    at logon.LogonTest.main(LogonTest.java:29) 
Caused by: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.DatabaseException 
Internal Exception: com.microsoft.sqlserver.jdbc.SQLServerException: Incorrect syntax near the keyword 'USER'. 
Error Code: 156 
Call: INSERT INTO USER (LOGIN, NAME, PASSWORD) VALUES (?, ?, ?) 
    bind => [3 parameters bound] 
Query: InsertObjectQuery([email protected]) 
    at org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:331) 
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeDirectNoSelect(DatabaseAccessor.java:895) 
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeNoSelect(DatabaseAccessor.java:957) 
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:630) 
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeCall(DatabaseAccessor.java:558) 
    at org.eclipse.persistence.internal.sessions.AbstractSession.basicExecuteCall(AbstractSession.java:1995) 
    at org.eclipse.persistence.sessions.server.ClientSession.executeCall(ClientSession.java:296) 
    at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:242) 
    at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:228) 
    at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.insertObject(DatasourceCallQueryMechanism.java:377) 
    at org.eclipse.persistence.internal.queries.StatementQueryMechanism.insertObject(StatementQueryMechanism.java:165) 
    at org.eclipse.persistence.internal.queries.StatementQueryMechanism.insertObject(StatementQueryMechanism.java:180) 
    at org.eclipse.persistence.internal.queries.DatabaseQueryMechanism.insertObjectForWrite(DatabaseQueryMechanism.java:485) 
    at org.eclipse.persistence.queries.InsertObjectQuery.executeCommit(InsertObjectQuery.java:80) 
    at org.eclipse.persistence.queries.InsertObjectQuery.executeCommitWithChangeSet(InsertObjectQuery.java:90) 
    at org.eclipse.persistence.internal.queries.DatabaseQueryMechanism.executeWriteWithChangeSet(DatabaseQueryMechanism.java:300) 
    at org.eclipse.persistence.queries.WriteObjectQuery.executeDatabaseQuery(WriteObjectQuery.java:58) 
    at org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:899) 
    at org.eclipse.persistence.queries.DatabaseQuery.executeInUnitOfWork(DatabaseQuery.java:798) 
    at org.eclipse.persistence.queries.ObjectLevelModifyQuery.executeInUnitOfWorkObjectLevelModifyQuery(ObjectLevelModifyQuery.java:108) 
    at org.eclipse.persistence.queries.ObjectLevelModifyQuery.executeInUnitOfWork(ObjectLevelModifyQuery.java:85) 
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2894) 
    at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1797) 
    at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1779) 
    at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1730) 
    at org.eclipse.persistence.internal.sessions.CommitManager.commitNewObjectsForClassWithChangeSet(CommitManager.java:226) 
    at org.eclipse.persistence.internal.sessions.CommitManager.commitAllObjectsWithChangeSet(CommitManager.java:125) 
    at org.eclipse.persistence.internal.sessions.AbstractSession.writeAllObjectsWithChangeSet(AbstractSession.java:4200) 
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitToDatabase(UnitOfWorkImpl.java:1439) 
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitToDatabaseWithChangeSet(UnitOfWorkImpl.java:1529) 
    at org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork.commitRootUnitOfWork(RepeatableWriteUnitOfWork.java:277) 
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitAndResume(UnitOfWorkImpl.java:1167) 
    at org.eclipse.persistence.internal.jpa.transaction.EntityTransactionImpl.commit(EntityTransactionImpl.java:132) 
    ... 1 more 
Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Incorrect syntax near the keyword 'USER'. 
    at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:216) 
    at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1515) 
    at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:404) 
    at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(SQLServerPreparedStatement.java:350) 
    at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:5696) 
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:1715) 
    at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:180) 
    at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:155) 
    at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeUpdate(SQLServerPreparedStatement.java:314) 
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeDirectNoSelect(DatabaseAccessor.java:885) 
    ... 32 more 

我的persistence.xml文件是在這裏

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"> 
    <persistence-unit name="User" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
     <class>logon.User</class> 
     <validation-mode>NONE</validation-mode> 
     <properties> 
       <property name="javax.persistence.jdbc.driver" value="com.microsoft.sqlserver.jdbc.SQLServerDriver" /> 
       <property name="javax.persistence.jdbc.url" 
        value="jdbc:sqlserver://localhost:1433;databaseName=rithishdb;create=true" /> 
       <property name="javax.persistence.jdbc.user" value="sa" /> 
       <property name="javax.persistence.jdbc.password" value="google" /> 
       <property name="eclipselink.ddl-generation" value="create-tables" /> 
     <property name="eclipselink.ddl-generation.output-mode" 
     value="database" /> 
      </properties> 
    </persistence-unit> 
</persistence> 

我的實體類是

package logon; 

import java.io.Serializable; 
import javax.persistence.*; 

/** 
* Entity implementation class for Entity: User 
* 
*/ 
@Entity 

public class User{ 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private int id; 
    String Name; 
    String Login; 
    String Password; 

    public int get_Id(){ 
     return id; 
    } 
    public void set_Id(int id){ 
    this.id = id; 
    } 
    public String getName(){ 
    return Name; 
    } 
    public void setName(String Name){ 
    this.Name = Name; 
    } 
    public String getLogin(){  
    return Login; 
    } 
    public void setLogin(String Login){ 
     this.Login = Login; 
    } 
    public String getPassword(){ 
     return Password; 
    } 
    public void setPassword(String Password){ 
     this.Password = Password; 
    } 

    } 

而且我持續存在的類

package logon; 

import java.util.List; 

import javax.persistence.EntityManager; 
import javax.persistence.EntityManagerFactory; 
import javax.persistence.Persistence; 
import javax.persistence.Query; 

public class LogonTest { 


    private static EntityManagerFactory factory; 

    public static void main(String[] args) { 
      factory = Persistence.createEntityManagerFactory("User"); 
      EntityManager em = factory.createEntityManager(); 
      // Read the existing entries and write to console 


      // Create new user 
      em.getTransaction().begin(); 
      User user = new User(); 

      user.setName("Tom Johnson"); 
      user.setLogin("tomj"); 
      user.setPassword("pass"); 
      em.persist(user); 
      em.getTransaction().commit(); 

      em.close(); 
    } 

} 

我能得到這個

回答

0

USER幫助是SQL保留關鍵字。您需要引用實體的「表格」屬性,或將名稱更改爲不是SQL關鍵字

請注意,某些JPA實現(例如,我使用DataNucleus JPA的實現)會爲您做所有這些工作,而不會造成衝突這種特定於數據庫的用戶行爲。

+0

非常感謝尼爾幫了我很多。我不能投票給你,因爲我的名聲很低 – user3808015

+0

沒問題。只是'接受'答案,即「滴答」符號。 –