2014-01-22 52 views
0

我想在表中插入主键。如何从我的控制器类设置"Identity Insert"属性ON?我已经试过这没有运气:如何在使用Play Framework时使用Play Framework插入主键2008

String sql = "SET IDENTITY_INSERT t_Student ON"; 

     Connection conn = play.db.DB.getConnection(); 
     try { 
      Statement stmt = conn.createStatement(); 
      try { 
       stmt.execute(sql); 
       student.save(); 
      } finally { 
       stmt.close(); 
      } 
     } finally { 
      conn.close(); 
     } 

在这里,我要保存"student"对象到数据库,但得到的错误:"Cannot insert explicit value for identity column in table 't_Student' when IDENTITY_INSERT is set to OFF."在此先感谢。

回答

2

一件重要的事情。

IDENTITY_INSERT在数据库表中与primary key没有任何关系。而且在你的情况下,它与玩框架无关。 Primary key的快捷方式是不允许向列(或列)添加相同值的约束。很明显。 IDENTITY_INSERT表示您明确控制PK约束的值。你是老板。
例如:

CREATE TABLE student (id int PRIMARY KEY, name varchar(40)) 

这种情况模拟SET IDENTITY_INSERT ON,并在数据库架构非常罕见。不过很少见,你需要明确地把idname。你必须意识到,目前的id不会与现有的主键干涉表:

INSERT INTO student VALUES(1,'John') 

对于第一次这样的代码将工作,但是当你尝试重新插入,因为你要添加的值相同,将引发异常为PK

SET IDENTITY_INSERT OFF另一方面让你忘记每次插入id,因为数据库引擎会为你做。它也将保持PK的约束。

CREATE TABLE student (id int IDENTITY PRIMARY KEY, name varchar(40)) 

如果你想插入行的表,你可以这样做:

INSERT INTO student('Johny Paul') 

如果你将迫使ID

INSERT INTO student VALUES(666,'Johnny Rambo') 

您将有例外:An explicit value for the identity column in table 'student' can only be specified when a column list is used and IDENTITY_INSERT is ON.有一些当你需要完全控制数据库值时:dictionary tables跨越很多环境,或者当你的PK被破坏,y你需要对PK进行“手术”。否则,请勿使用IDENTITY_INSERT ON。也许在EBean无法识别insert语句是否应该使用id。

回答

我强烈建议使用表IDENTITYIDENTITY_INSERT OFF)。我用Ebean只有几次(我不喜欢这个数据库层框架),但我认为,代码应帮助:

@Entity 
@Table(name="student") 
public class Student { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    public Long id; 
    public String name; 
} 

Student student = new Student(); 
student.name = "Jonny JDK"; 
Ebean.save(student); 

或者你可以写原始SQL:

SqlUpdate insert = Ebean.createSqlUpdate("INSERT INTO student VALUES ('Jonny Bravo')"); 
insert.execute();