2014-01-22 50 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();