一件重要的事情。
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();