Chcę wstawić klucz podstawowy do tabeli. Jak ustawić "Identity Insert"
właściwość WŁĄCZONA z mojej klasy kontrolera? Próbowałem tego bez powodzenia:
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();
}
Tutaj chcę zapisać "student"
obiekt w bazie danych, ale pojawia się błąd: "Cannot insert explicit value for identity column in table "t_Student" when IDENTITY_INSERT is set to OFF."
Z góry dziękuję.
Odpowiedzi:
2 dla odpowiedzi № 1IDENTITY_INSERT
nie ma nic do primary key
w tabeli bazy danych. Co więcej, nie ma to nic wspólnego z playframework w twojej sytuacji. Primary key
w skrócie jest to ograniczenie, które nie pozwala na dodanie tej samej wartości do kolumny (lub kolumn). To oczywiste. IDENTITY_INSERT
oznacza, że przejmujesz kontrolę nad wartością dla PK
przymus. Jesteś szefem.
Na przykład:
CREATE TABLE student (id int PRIMARY KEY, name varchar(40))
Ta sytuacja symuluje SET IDENTITY_INSERT ON
i jest bardzo rzadki w schemacie bazy danych. Niemniej jednak jest to rzadkie, musisz to wyraźnie wytłumaczyć id
i name
. Musisz być świadomy tego prądu id
nie będzie kolidować z istniejącymi kluczami głównymi w tabeli:
INSERT INTO student VALUES(1,"John")
Po raz pierwszy ten kod będzie działał, ale gdy spróbujesz go wstawić ponownie, pojawi się wyjątek, ponieważ chcesz dodać tę samą wartość co PK
.
SET IDENTITY_INSERT OFF
z drugiej strony pozwalają zapomnieć o wstawieniu id
za każdym razem, ponieważ silnik bazy danych zrobi to za Ciebie. To również zachowa PK
przymus.
CREATE TABLE student (id int IDENTITY PRIMARY KEY, name varchar(40))
A jeśli chcesz wstawić wiersz do tabeli, możesz to zrobić:
INSERT INTO student("Johny Paul")
A jeśli zmusisz ID
:
INSERT INTO student VALUES(666,"Johnny Rambo")
Będziesz miał wyjątek: 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.
W niektórych sytuacjach konieczna jest pełna kontrola wartości bazy danych: dictionary tables
w wielu środowiskach lub gdy PK
jest uszkodzony i musisz „operować” PK. W przeciwnym razie nie używaj IDENTITY_INSERT ON
. Być może pod maską EBean nie może rozpoznać, czy instrukcja insert powinna używać id, czy nie.
Odpowiedź
Zdecydowanie sugeruję używanie tabeli z IDENTITY
(IDENTITY_INSERT OFF
). Użyłem Ebean tylko kilka razy (nie podoba mi się ten szkielet warstwy bazy danych), ale myślę, że kod powinien pomóc:
@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);
Lub możesz napisać surowy SQL:
SqlUpdate insert = Ebean.createSqlUpdate("INSERT INTO student VALUES ("Jonny Bravo")");
insert.execute();