[英]How to auto increment the the id in postgersql?
問候..我正在嘗試將對象添加到我的 PostgreSQL 數據庫中,一切正常,但是當我在數據庫中添加第二個 object 時,它只會覆蓋第一個
學生 Class
@Entity
@Table(name = "student")
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(columnDefinition="serial")
private int id;
@Column(name="first_name")
private String firstName;
@Column(name="last_name")
private String lastName;
@Column(name="email")
private String email;
public Student() {
}
public Student(String firstName, String lastName, String email) {
this.firstName = firstName;
this.lastName = lastName;
this.email = email;
}
hibernate.cfg.xml
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property>
<property name="hibernate.connection.driver_class">org.postgresql.Driver</property>
<property name="hibernate.connection.username">user1</property>
<property name="hibernate.connection.password">test123</property>
<property name="hibernate.connection.url">jdbc:postgresql://127.0.0.1:5432/hb_student_tracker</property>
<property name="hibernate.current_session_context_class">thread</property>
<property name="connection_pool_size">1</property>
<property name="hbm2ddl.auto">create</property>
<property name="show_sql">true</property>
</session-factory>
</hibernate-configuration>
CreatStudentDemo.java
public static void main(String[] args) {
//create session Factory
SessionFactory factory = new Configuration()
.configure()
.addAnnotatedClass(Student.class)
.buildSessionFactory();
//create Session
Session session = factory.getCurrentSession();
try {
System.out.println("Creating new Studnet Object..");
//create Student Object
Student student = new Student("Souid","Ayoub","ayoub@luv2code.com");
//start the transaction
session.beginTransaction();
//save the object
System.out.println("Saving the Student...");
session.save(student);
//commit the transaction
session.getTransaction().commit();
System.out.println("Done !");
} finally {
factory.close();
}
}
我的表 SQL
CREATE TABLE public.student
(
id integer NOT NULL DEFAULT nextval('student_id_seq'::regclass),
email character varying(255) COLLATE pg_catalog."default",
first_name character varying(255) COLLATE pg_catalog."default",
last_name character varying(255) COLLATE pg_catalog."default",
CONSTRAINT student_pkey PRIMARY KEY (id)
)
WITH (
OIDS = FALSE
)
TABLESPACE pg_default;
ALTER TABLE public.student
OWNER to user1;
第一個 object 在數據庫中寫得很好,第二個將覆蓋第一個
我認為您的問題是對 @Id 列使用原始類型。
這里 Hibernate 對 javadoc 中的save()
方法說了什么;
持久化給定的瞬態實例,首先分配一個生成的標識符。 (或者,如果使用分配的生成器,則使用標識符屬性的當前值。)如果關聯映射為 cascade="save-update",則此操作級聯到關聯的實例。
CrudRepository#save()
方法檢查數據庫中的學生 id,第一條和第二條記錄均為 0。 由於 Hibernate 找到了一條記錄並認為您沒有插入記錄,因此您正在更新 id 為 0 的記錄。
如果您確實修改了如下代碼,它應該可以工作;
@Entity
@Table(name = "student")
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(columnDefinition="serial")
private Integer id;
現在,Hibernate 將檢查您的 id,如果它是新記錄,則 id 字段將為 null 所以 Hibernate 說這是一條新記錄,應該作為新記錄插入。
此外,還有一件事。 您在 hibernate 配置中設置hbm2ddl.auto
。 您可以在此處查看hbm2ddl.auto
的更多詳細信息。
<property name="hbm2ddl.auto">create</property>
在這種情況下,一旦CreatStudentDemo
工作,hibernate 就會破壞您的舊表。 這意味着,它會刪除 Student 表並創建一個新表。 然后它按預期在數據庫中創建一個學生記錄,假設是 Student1。
事情是這樣的,您重新運行CreatStudentDemo
,您希望第二個 object 將作為 Student2 插入。 然而,真正發生的情況是——當您重新運行CreatStudentDemo
hibernate 會破壞 Student1 被刪除的表。 然后它創建 Student 表並插入 id 為 1 的 Student 對象,因為這是新創建的 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);
.....
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.