无法使用Hibernate正确地将数据插入数据库

时间:2015-08-03 19:07:03

标签: java hibernate servlets serialization objectoutputstream

我最近开始使用Hibernate。我面临以下问题

描述:对于对象客户,当我尝试使用hibernate saveOrUpdate将数据插入数据库时​​,它将删除customer表中的所有条目并仅插入包含新数据的新行。我无法弄清楚导致问题的原因。如果在session.saveOrUpdate(customer)之后通过添加具有不同唯一CODE的新Customer对象(即customer1)来尝试同时插入另一个数据,我将获得标识符已存在异常。

数据库中表格的定义如下

create table customer(
    code varchar(100) not null,
    name varchar(100) not null,
    address varchar(1000) not null,
    phone1 varchar(100) not null,
    phone2 varchar(100),
    credit_limit double default 0,
    current_credit double default 0,
    primary key ( code )
);

定义的Java对象如下

package com.jwt.hibernate.bean;

import java.io.Serializable;

public class Customer implements Serializable{

    /**
     * 
     */
    private static final long serialVersionUID = 2590997804699225005L;

    private String code;
    private String name;
    private String address;
    private String phone1;
    private String phone2;
    private Double creditLimit;
    private Double currentCredit;

    public String getCode() {
        return code;
    }
    public void setCode(String code) {
        this.code = code;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    public String getPhone1() {
        return phone1;
    }
    public void setPhone1(String phone1) {
        this.phone1 = phone1;
    }
    public String getPhone2() {
        return phone2;
    }
    public void setPhone2(String phone2) {
        this.phone2 = phone2;
    }
    public Double getCreditLimit() {
        return creditLimit;
    }
    public void setCreditLimit(Double creditLimit) {
        this.creditLimit = creditLimit;
    }
    public Double getCurrentCredit() {
        return currentCredit;
    }
    public void setCurrentCredit(Double currentCredit) {
        this.currentCredit = currentCredit;
    }
}

执行hibernate操作的类如下所示

package com.jwt.hibernate.dao;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

import com.jwt.hibernate.bean.Customer;

public class CustomerDAO {
    public boolean save(Customer customer){

        try{
        // 1. configuring hibernate
        Configuration configuration = new Configuration().configure();
        // 2. create sessionfactory
        SessionFactory sessionFactory = configuration.buildSessionFactory();
        // 3. Get Session object
        Session session = sessionFactory.openSession();
        // 4. Starting Transaction
        Transaction transaction = session.beginTransaction();

        session.saveOrUpdate(customer);
        transaction.commit();
        session.close();
        sessionFactory.close();

        } catch (HibernateException e) {
            System.out.println(e.getMessage());
            System.out.println("error");
        }
        finally{

        }
        return true;
    }
}

Hibernate config xml如下所示

<?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.jwt.hibernate.bean.Customer" table="CUSTOMER">
        <id column="CODE" name="code" type="java.lang.String" />
        <property column="NAME" name="name" type="java.lang.String" />
        <property column="ADDRESS" name="address" type="java.lang.String" />
        <property column="PHONE1" name="phone1" type="java.lang.String" />
        <property column="PHONE2" name="phone2" type="java.lang.String" />
        <property column="CREDIT_LIMIT" name="creditLimit" type="java.lang.Double" />
        <property column="CURRENT_LIMIT" name="currentCredit" type="java.lang.Double" />
    </class>
</hibernate-mapping>

处理请求的Servlet如下所示

package com.jwt.hibernate.controller;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.jwt.hibernate.bean.Customer;
import com.jwt.hibernate.dao.CustomerDAO;


public class CustomerControllerServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    protected void doPost(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        ObjectInputStream in = new ObjectInputStream(request.getInputStream());
        try {
            Object object = (Object) in.readObject();
            in.close();
            String action = request.getParameter("action");
            if(action!= null && action.equals("save")){
                save(object, response);
            }
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


    }

    private void save(Object object, HttpServletResponse response) throws IOException{

        Customer customer = (Customer) object;
        try {
            CustomerDAO customerDAO = new CustomerDAO();
            customerDAO.save(customer);
            ObjectOutputStream oos = new ObjectOutputStream(response.getOutputStream());
            oos.writeObject(customer);
            oos.flush();
            oos.close();
        } 
        catch (Exception e) {    
                e.printStackTrace();
        }
    }
}

发送保存到数据库的对象的客户端代码如下所示

public static Object save(Object object,int objectType)
    {
        URL url;
        if(objectType == TYPE_CUSTOMER) {
            Customer customer = (Customer) object;

            try {
                url = new URL("http://localhost:8080/CrossoverServer/Customer?action=save");
                urlCon = (HttpURLConnection) url.openConnection();

                urlCon.setDoOutput(true); // to be able to write.
                urlCon.setDoInput(true); // to be able to read.

                out = new ObjectOutputStream(urlCon.getOutputStream());
                out.writeObject(customer);
                out.close();

                ObjectInputStream ois = new ObjectInputStream(urlCon.getInputStream());
                customer = (Customer) ois.readObject();
                ois.close();
                return customer;
            } catch (IOException e) {
                e.printStackTrace();
            }
            catch ( ClassNotFoundException e2) {
                e2.printStackTrace();
            }
        }

        return null;
    }

客户对象的创建方式如下所示

public Object guiToObject() 
    {
        Customer customer = new Customer();
        customer.setCode(txtCode.getText());
        customer.setName(txtName.getText());
        customer.setAddress(txtAddress.getText());
        customer.setPhone1(txtPhone1.getText());
        customer.setPhone2(txtPhone2.getText());
        customer.setCreditLimit((Double) Double.parseDouble(txtCreditLimit.getText()));
        if(txtCurrentCredit.getText() != null && !txtCurrentCredit.getText().trim().isEmpty())
            customer.setCurrentCredit((Double) Double.parseDouble(txtCurrentCredit.getText().trim()));
        else
            customer.setCurrentCredit(0.0);
        return customer;
    }

有人可以帮助我将上述新行插入客户表的方法出现问题。

感谢。

2 个答案:

答案 0 :(得分:0)

可能的原因可能是您的代码重新创建表格并添加记录后缀。

您是否尝试过调试并查看数据库端以查看插入之前发生了什么?

一面注意;你的finally块是空白的。你应该让你的会话结束,并在finally块中编码类似的东西。

答案 1 :(得分:0)

感谢他快速回应。

我发现了原因。

更改hibernate.cfg.xml中的以下属性来自&#34;创建&#34;到&#34;验证&#34;解决了这个问题。

验证

感谢。