簡體   English   中英

當 IDENTITY_INSERT 設置為 OFF 時,無法為表 'Employee' 中的標識列插入顯式值

[英]Cannot insert explicit value for identity column in table 'Employee' when IDENTITY_INSERT is set to OFF

我創建了一個項目,它與 MySQL 一起工作得很好。 在使用 SQL Server 而不是 MySQL 之后,我遇到了一個問題:讀取、更新和刪除工作正常,但是我無法創建新員工。 下面是: SpringMain.java

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

彈簧文件

 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="employeeDAO" class="com.journaldev.spring.jdbc.dao.EmployeeDAOImpl"> <property name="dataSource" ref="dataSource" /> </bean> <bean id="employeeDAOJDBCTemplate" class="com.journaldev.spring.jdbc.dao.EmployeeDAOJDBCTemplateImpl"> <property name="dataSource" ref="dataSource" /> </bean> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver" /> <property name="url" value="jdbc:sqlserver://localhost:1433;database=bbb"/> <property name="username" value="lm" /> <property name="password" value="pp" /> </bean> </beans>

雇員.java

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

EmployeeDAOJDBCTemplateImpl

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

員工道.java

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

我在 SQL Server 上生成的查詢是:

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

運行文件 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. at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:243) at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73) at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:658) at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:907) at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:968) at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:978) at com.journaldev.spring.jdbc.dao.EmployeeDAOJDBCTemplateImpl.save(EmployeeDAOJDBCTemplateImpl.java:32) 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. at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:197)

谷歌搜索后,我發現我必須把

 SET IDENTITY_INSERT [dbo].[IdentityInsert] ON

但是,這無法解決異常。 你能告訴我缺少什么嗎? 提前致謝。

IDENTITY(1,1) 表示從seed值開始自動插入該列的值,即 1(逗號前),並在插入新行時按increment 1(逗號后)遞增值。

如果您希望自動生成id ,那么您需要進行一些更改,例如

public Employee(String name, String role){    
    this.name = name;
    this.role = role;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM