hibernate自动创建重复列

时间:2016-02-09 05:49:54

标签: java hibernate hql

我最近开始学习HQL,并尝试创建一个测试应用程序,看看它是如何工作的。但是当我试图运行项目时,我看到重复的列正在创建,其中包含NULL值。

以下是我的项目详情

我有一个表(保险),这个结构{id,insurance_name,invest_amount,investment_date}我已经创建了它。

当我运行应用程序时,它创建了两个具有空值{id,insurance_name,invest_amount,investment_date,INSURANCE_AMOUNT,INSURANCE_DATE}的附加列,我不知道它们是从哪里创建的。

hibernate配置文件:

<?xml version="1.0"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
<session-factory>
 <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
 <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate4</property>
 <property name="hibernate.connection.username">root</property>
 <property name="hibernate.connection.password">root</property>
 <property name="hibernate.connection.pool_size">10</property>
 <property name="show_sql">true</property>
 <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
 <property name="hibernate.hbm2ddl.auto">update</property>
 <mapping resource="insurance.hbm.xml"/>
</session-factory>

映射文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
 <class name="com.roseindia.app.HQL.Insurance" table="INSURANCE">
    <id name="id" type="long" column="ID">
        <generator class="increment"></generator>
    </id>
    <property name="insuranceName">
        <column name="INSURANCE_NAME"></column>
    </property>
    <property name="investmentAmount">
        <column name="INSURANCE_AMOUNT"></column>
    </property>
    <property name="investmentDate">
        <column name="INSURANCE_DATE"></column>
    </property> 
 </class>
</hibernate-mapping>

POJO课程:

public class Insurance {

private Long id;
private String insuranceName;
private Integer investmentAmount;
private Date investmentDate;

public Long getId() {
    return id;
}
public void setId(Long id) {
    this.id = id;
}
public String getInsuranceName() {
    return insuranceName;
}
public void setInsuranceName(String insuranceName) {
    this.insuranceName = insuranceName;
}
public Integer getInvestmentAmount() {
    return investmentAmount;
}
public void setInvestmentAmount(Integer investmentAmount) {
    this.investmentAmount = investmentAmount;
}
public Date getInvestmentDate() {
    return investmentDate;
}
public void setInvestmentDate(Date investmentDate) {
    this.investmentDate = investmentDate;
}
}

主要课程:

public class SelectClauseExample {

public static void main(String[] args) {
    // TODO Auto-generated method stub

    Session session =null;

    try{

        SessionFactory sessionFactory =new Configuration().configure().buildSessionFactory();
        session= sessionFactory.openSession();

        String SQL_QUERY="select insurance.id, insurance.insuranceName,insurance.investmentAmount,insurance.investmentDate from Insurance insurance";

        Query query = session.createQuery(SQL_QUERY);

        for (java.util.Iterator it = query.iterate(); it.hasNext();){
            System.out.print("Inside for");
            Object[] row = (Object[]) it.next();
            System.out.println("ID: "+row[0]);
            System.out.println("Name: "+row[1]);
            System.out.println("Amount: "+row[2]);
            System.out.println("Date: "+row[3]);
        }


    }catch(Exception e){

    }finally{
        session.flush();
        session.close();

    }

}

}

2 个答案:

答案 0 :(得分:0)

你从配置文件中跳过属性hibernate.hbm2ddl.auto(这意味着默认值,这意味着在省略此设置时不会进行验证,更新,创建或删除)或者如果你没有&#{1}}则使用validate 39;要在数据库中进行任何更新

请参阅Hibernate hbm2ddl.auto, possible values and what they do - any official explanation?,了解&#39; hibernate.hbm2ddl.auto&#39;的可能值。

答案 1 :(得分:0)

尝试替换它:

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

使用:

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

在此模式下,您的架构中不会有任何更改,因为您的文件中已包含Mapping file:

       <property name="investmentAmount">
    <column name="INSURANCE_AMOUNT"></column>
</property>
<property name="investmentDate">
    <column name="INSURANCE_DATE"></column>

每次运行upplication时,yoyr架构都会被更改。