亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在postgersql中自動增加id?

如何在postgersql中自動增加id?

喵喔喔 2023-08-16 16:35:51
問候..我正在嘗試將對象添加到我的 PostgreSQL 數據庫,一切正常,但是當我在數據庫中添加第二個對象時,它只會覆蓋第一個對象學生班@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;    }休眠配置文件<!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>第一個對象在數據庫中寫入正常,第二個對象將覆蓋第一個對象
查看完整描述

1 回答

?
慕無忌1623718

TA貢獻1744條經驗 獲得超4個贊

我認為您的問題是對 @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 字段將為空,因此 Hibernate 表示這是一條新記錄,應該將其作為新記錄插入。


另外,還有一件事。您hbm2ddl.auto在休眠配置中進行設置。

在這種情況下,一旦CreatStudentDemo工作,休眠就會破壞你的舊表。這意味著,它刪除 Student 表并創建一個新表。然后它按預期在數據庫中創建一條學生記錄,比方說 Student1。

事情是這樣的,您重新運行CreatStudentDemo,您期望第二個對象將作為 Student2 插入。然而,真正發生的事情是這樣的——當您重新運行CreatStudentDemohibernate 時,會破壞 Student1 被刪除的表。然后它創建 Student 表并插入 id 為 1 的 Student 對象,因為這是新創建的 Student 表上的第一條記錄。

基本上,你可以設置;

<property?name="hbm2ddl.auto">update</property>

或者,您可以調用save()方法兩次,例如;

? ? Student student = new Student("Souid","Ayoub","[email protected]");

? ? ? ? Student student2 = new Student("Test Student","TestStudent","[email protected]");


? ? ? ? //start the transaction

? ? ? ? session.beginTransaction();


? ? ? ? //save the object

? ? ? ? System.out.println("Saving the Student...");

? ? ? ? session.save(student);

? ? ? ? session.save(student2);

? ? ? ? .....


查看完整回答
反對 回復 2023-08-16
  • 1 回答
  • 0 關注
  • 182 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號