Я думаю, что ваша проблема в использовании примитивного типа для столбца @Id.
Вот что говорит Hibernate для метода save()
в javadoc;
Сохраняет данный временный экземпляр, сначала назначая сгенерированный идентификатор.(Или используя текущее значение свойства идентификатора, если используется назначенный генератор.) Эта операция распространяется каскадно на связанные экземпляры, если сопоставление отображается с помощью cascade = "save-update".
CrudRepository#save()
Метод проверяет идентификатор студента, который равен 0 для первой и второй записи, в базе данных.Поскольку Hibernate находит запись и думает, что вы не вставляете запись, вместо этого вы обновляете запись с идентификатором 0.
Если вы измените свой код, как показано ниже, это должно сработать;
@Entity
@Table(name = "student")
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(columnDefinition="serial")
private Integer id;
Теперь Hibernate проверит ваш идентификатор, и если это новая запись, поле id будет нулевым, поэтому Hibernate говорит, что это новая запись, и ее следует вставить как новую запись.
Кроме того, есть еще одна вещь.Вы устанавливаете hbm2ddl.auto
в своей конфигурации гибернации.Вы можете проверить более подробную информацию о hbm2ddl.auto
, здесь .
<property name="hbm2ddl.auto">create</property>
В этом случае, когда CreatStudentDemo
работает, hibernate уничтожает вашу старую таблицу.Это означает, что он удаляет таблицу Student и создает новую таблицу.Затем он создает запись Student в базе данных, как и ожидалось, скажем Student1.
Вот эта вещь, вы повторно запускаете CreatStudentDemo
и ожидаете, что второй объект будет вставлен как Student2.Однако вот что происходит на самом деле - при повторном запуске CreatStudentDemo
hibernate уничтожает таблицу, которую Student1 удалил.Затем он создает таблицу Student и вставляет объекты Student с идентификатором 1, потому что это первая запись во вновь созданной таблице Student.
Как правило, вы можете установить;
<property name="hbm2ddl.auto">update</property>
илиможет вызвать save()
метод два раза, например;
Student student = new Student("Souid","Ayoub","ayoub@luv2code.com");
Student student2 = new Student("Test Student","TestStudent","test@mail.com");
//start the transaction
session.beginTransaction();
//save the object
System.out.println("Saving the Student...");
session.save(student);
session.save(student2);
.....