一件重要的事情。
IDENTITY_INSERT
在數據庫表中與primary key
沒有任何關係。而且在你的情況下,它與玩框架無關。 Primary key
的快捷方式是不允許向列(或列)添加相同值的約束。很明顯。 IDENTITY_INSERT
表示您明確控制PK
約束的值。你是老闆。
例如:
CREATE TABLE student (id int PRIMARY KEY, name varchar(40))
這種情況模擬SET IDENTITY_INSERT ON
,並在數據庫架構非常罕見。不過很少見,你需要明確地把id
和name
。你必須意識到,目前的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。
回答
我強烈建議使用表IDENTITY
(IDENTITY_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();