簡體   English   中英

如何自動增加postgersql中的id?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM