簡體   English   中英

Hibernate:新的 Session 不掉表

[英]Hibernate: New Session without dropping the tables

我是 Hibernate 的新手(從昨天開始實施),我成功地創建了一個方法,將我的客戶對象傳輸到數據庫。

在我退出我的應用程序並再次啟動它並使用此設置基於我的 hibernate.cfg.xml 文件創建一個新的 session (以其他方法)后:

<property name="hibernate.hbm2ddl.auto">create</property>

它導致這一點,所有相關的表,用 Hibernate 創建的被刪除。 所以也許這是一個理解問題,但我認為“休眠的透明持久性”也意味着我的 POJO 在我的應用程序運行時之外是持久的?

因此,我閱讀了有關 Stackoverflow 的幾個主題並使用此設置進行了嘗試:

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

但這會導致 SQL 錯誤:

com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException: Duplicate entry '1' for key 'PRIMARY'

當然我不希望有重復,所以我想 hibernate 不會發送 SQL 語句引用現有的 object。

它發送如下聲明:

UPDATE `customer` SET `id`=1,`birthday`='1990-10-05 00:00:00',`forename`='TestCustomer',`gender`='F',`generatedProfitsLastYear`='0',`generatedProfitsTotal`='0',`surename`='A',`gcid`='1' 

但我需要同樣的聲明,帶有

Where `id`=1

在最后。

所以基本上我想要的是,當我重新啟動我的應用程序並根據配置文件創建一個新的 session 時,hibernate 不會刪除所有表並再次創建它。 因此,在我打開一個新的 session 后,我可以將存儲在數據庫中的客戶對象傳輸到 POJO。 我是否錯誤地理解了 hibernate 的概念,還是我犯了一個典型的初學者錯誤?

您將在下面找到我的客戶 Class:

@Entity
@Table(name="CUSTOMER")

public class Customer {
    private int id;
    private String forename;
    private String surname;
    private char gender;
    private Date birthday;
    private double generatedProfitsTotal;
    private double generatedProfitsLastYear;    
    private CustomerGroup assignedTo;

    public Customer(int id, String forename, String surname, char gender,
            Date birthday) {
        super();
        this.id = id;
        this.forename = forename;
        this.surname = surname;
        this.gender = gender;
        this.birthday = birthday;
    }

    @Id
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    @Column(name = "forename")
    public String getForename() {
        return forename;
    }

    public void setForename(String forename) {
        this.forename = forename;
    }
    @Column(name = "surename")
    public String getSurname() {
        return surname;
    }

    public void setSurname(String surname) {
        this.surname = surname;
    }
    @Column(name = "gender")
    public char getGender() {
        return gender;
    }

    public void setGender(char gender) {
        this.gender = gender;
    }
    @Column(name = "birthday")
    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
    @Column(name = "generatedProfitsTotal")
    public double getGeneratedProfitsTotal() {
        return generatedProfitsTotal;
    }

    public void setGeneratedProfitsTotal(double generatedProfitsTotal) {
        this.generatedProfitsTotal = generatedProfitsTotal;
    }
    @Column(name = "generatedProfitsLastYear")
    public double getGeneratedProfitsLastYear() {
        return generatedProfitsLastYear;
    }

    public void setGeneratedProfitsLastYear(double generatedProfitsLastYear) {
        this.generatedProfitsLastYear = generatedProfitsLastYear;
    }


    @ManyToOne(fetch=FetchType.EAGER)
    @JoinColumn(name="gcid", nullable=true, insertable=true, updatable=true)
    public CustomerGroup getAssignedTo() {
        return assignedTo;
    }

    public void setAssignedTo(CustomerGroup assignedTo) {
        this.assignedTo = assignedTo;
    }
}

我的 hibernate 配置文件:

<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.password">root</property>
        <property name="hibernate.connection.url">jdbc:mysql://127.0.0.1/hibernatetesting</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
        <property name="show_sql">true</property>
        <property name="hibernate.hbm2ddl.auto">update</property>
        <mapping class="studyproject.Customer"/>
         <mapping class="studyproject.CustomerGroup"/>
         <mapping class="studyproject.BonusPackage"/>

    </session-factory>
</hibernate-configuration>

謝謝

在發生“重復錯誤”的地方您做了什么? 現在,我將hibernate.hbm2ddl.auto配置為您的,但是可以在本地保存或更新實體。

嘗試使用 session.save() 方法的 session.saveOrUpdate() 方法,它將防止您的數據庫在獲取數據時下降,將其與 hbm2ddl.auto 一起使用更新它對我有用,希望對您有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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