2016-08-08 11 views
1

プロジェクトを作成しました。 MySQLではなくSQL Serverを作成した後、問題が発生します。読み取り、更新、および削除は正常に機能しますが、新しい従業員を作成することはできません。 ベローは、次のとおり SpringMain.javaIDENTITY_INSERTがOFFに設定されていると、 'Employee'テーブルのID列に明示的な値を挿入できません。

public class SpringMain 
 
{ 
 
\t public static void main(String[] args) 
 
\t { 
 
\t \t ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("spring.xml"); 
 
\t \t EmployeeDAO employeeDAO = ctx.getBean("employeeDAOJDBCTemplate", EmployeeDAO.class); 
 
\t \t Employee emp = new Employee(); 
 
\t \t emp.setName("Saria"); 
 
\t \t emp.setRole("CEO"); 
 
\t \t employeeDAO.save(emp); 
 
\t } 
 
}

spring.xml

<?xml version="1.0" encoding="UTF-8"?> 
 
<beans xmlns="http://www.springframework.org/schema/beans" 
 
\t xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 
\t xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> 
 

 
\t <bean id="employeeDAO" class="com.journaldev.spring.jdbc.dao.EmployeeDAOImpl"> 
 
\t \t <property name="dataSource" ref="dataSource" /> 
 
\t </bean> 
 
\t 
 
\t <bean id="employeeDAOJDBCTemplate" class="com.journaldev.spring.jdbc.dao.EmployeeDAOJDBCTemplateImpl"> 
 
\t \t <property name="dataSource" ref="dataSource" /> 
 
\t </bean> 
 
\t 
 
\t <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
 
\t \t <property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver" /> 
 
\t \t <property name="url" value="jdbc:sqlserver://localhost:1433;database=bbb"/> 
 
\t \t <property name="username" value="lm" /> 
 
\t \t <property name="password" value="pp" /> 
 
\t </bean> 
 

 
</beans>

Employee.java

@Entity 
 
@Table(name="Employee") 
 
public class Employee 
 
{ 
 
\t @Id  
 
\t @GeneratedValue(strategy=GenerationType.IDENTITY) 
 
\t @Column(name = "id", unique = true, nullable = false) 
 
\t private int id; 
 
\t 
 
\t @Column(name = "name") 
 
\t private String name; 
 
\t 
 
\t @Column(name = "role") 
 
\t private String role; 
 
\t 
 
\t public Employee() {} 
 
\t public Employee(int id, String name, String role) 
 
\t { 
 
\t \t this.id = id; 
 
\t \t this.name = name; 
 
\t \t this.role = role; 
 
\t } 
 
}

EmployeeDAOJDBCTemplateImpl

public class EmployeeDAOJDBCTemplateImpl implements EmployeeDAO 
 
{ 
 
\t private DataSource dataSource; 
 

 
\t public void setDataSource(DataSource dataSource) 
 
\t { 
 
\t \t this.dataSource = dataSource; 
 
\t } 
 
\t 
 
\t @Override 
 
\t public void save(Employee employee) 
 
\t { 
 
\t \t String query = "insert into Employee (id, name, role) values (?,?,?)"; 
 
\t \t JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); 
 
\t \t Object[] args = new Object[] {employee.getId(), employee.getName(), employee.getRole()}; 
 
\t \t int out = jdbcTemplate.update(query, args); 
 
\t \t if(out !=0) 
 
\t \t { 
 
\t \t \t System.out.println("Employee saved with id="+employee.getId()); 
 
\t \t } 
 
\t \t else System.out.println("Employee save failed with id="+employee.getId()); 
 
\t } 
 
}

EmployeeDao.java

public interface EmployeeDAO 
 
{ 
 
\t public void save(Employee employee); 
 
}

私はSQL Server上で生成されたクエリは次のとおりです。

CREATE TABLE [bbb].[dbo].[Employee] 
 
(
 
\t id int IDENTITY(1,1) PRIMARY KEY, 
 
\t name varchar(255) NOT NULL, 
 
\t role varchar(255) NOT NULL 
 
)

後方に表示されます例外ERファイルを実行しているSpringMain.javaは、グーグルの後

Exception in thread "main" org.springframework.dao.DataIntegrityViolationException: PreparedStatementCallback; SQL [insert into Employee (id, name, role) values (?,?,?)]; Cannot insert explicit value for identity column in table 'Employee' when IDENTITY_INSERT is set to OFF.; nested exception is com.microsoft.sqlserver.jdbc.SQLServerException: Cannot insert explicit value for identity column in table 'Employee' when IDENTITY_INSERT is set to OFF. 
 
\t at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:243) 
 
\t at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73) 
 
\t at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:658) 
 
\t at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:907) 
 
\t at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:968) 
 
\t at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:978) 
 
\t at com.journaldev.spring.jdbc.dao.EmployeeDAOJDBCTemplateImpl.save(EmployeeDAOJDBCTemplateImpl.java:32) 
 
\t at com.journaldev.spring.jdbc.main.SpringMain.main(SpringMain.java:31) 
 
Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Cannot insert explicit value for identity column in table 'Employee' when IDENTITY_INSERT is set to OFF. 
 
\t at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:197)

ですが、私は、私はしかし

SET IDENTITY_INSERT [dbo].[IdentityInsert] ON

を置くために有することを見出し、これはできません例外を解決します。 何が足りないのか教えてください。前もって感謝します。

+0

を行う必要がありますか? – Lamak

+0

私はこれらの2つのクラスを使用しています: – saria

+0

あなたは自分で 'id'の値を挿入したいのですが?手動で挿入する必要がある場合は、IDENTITY_SPECIFICATIONを削除します。明示的に 'id'の値を挿入したいのであれば、 – jonju

答えて

0

IDENTITY(1,1)は、新しい行が挿入されるたびに、seed値1(つまりカンマの前)から自動的に値を挿入し、incrementつまり1(カンマの後)で値を増やすことを意味します。

あなたはidが自動生成されたことにしたいなら、あなたはどのようにそれらの値を挿入する

のようないくつかの変更
public Employee(String name, String role){  
    this.name = name; 
    this.role = role; 
} 
関連する問題