Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate:不删除表的新会话_Java_Hibernate_Hibernate Mapping - Fatal编程技术网

Java Hibernate:不删除表的新会话

Java Hibernate:不删除表的新会话,java,hibernate,hibernate-mapping,Java,Hibernate,Hibernate Mapping,我从昨天开始就不熟悉Hibernate实现,我成功地创建了一个方法,将我的客户对象传输到数据库 在我退出应用程序并再次启动它并基于hibernate.cfg.xml文件以其他方法创建新会话后,请使用以下设置: <property name="hibernate.hbm2ddl.auto">create</property> <property name="hibernate.hbm2ddl.auto">update</property> 当然,

我从昨天开始就不熟悉Hibernate实现,我成功地创建了一个方法,将我的客户对象传输到数据库

在我退出应用程序并再次启动它并基于hibernate.cfg.xml文件以其他方法创建新会话后,请使用以下设置:

<property name="hibernate.hbm2ddl.auto">create</property>
<property name="hibernate.hbm2ddl.auto">update</property>
当然,我不希望有重复的对象,所以我假设hibernate不发送引用现有对象的SQL语句

它发送如下语句:

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
最后

因此,基本上我想要的是,当我重新启动应用程序并基于配置文件创建新会话时,hibernate不会删除所有表并再次创建它。因此,在打开新会话后,我可以将存储在数据库中的客户对象传输到POJO。 我是否错误地理解了hibernate的概念,或者我犯了一个典型的初学者错误

下面是我的客户类别:

@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配置为您的,但在本地保存或更新实体是可以的。

请看一看:谢谢,也许我不明白,但当我使用update时,我的思路是正确的,对吗?不幸的是,更新导致了一个错误的SQL语句,在末尾没有WHERE id=X。这导致了重复错误。我用Hibernate发送的语句和Hibernate应该发送的内容编辑了我的起始帖子。您是否尝试使用值为validate的属性?在使用session.persistCustomer之前,我找到了一个解决方案,我必须使用session.saveOrUpdateCustomer
<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>