/ / Jak wstawić klucz podstawowy do tabeli podczas korzystania z Play Framework, Ebean, sql server 2008 - sql-server-2008, playframework

Jak wstawić klucz podstawowy do tabeli podczas korzystania z programu Play Framework, Ebean, serwera sql 2008 - sql-server-2008, ramka do odtwarzania

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 № 1

IDENTITY_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();