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

标签 java hibernate servlets serialization objectoutputstream

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

描述:对于对象 customer,当我尝试使用 hibernate saveOrUpdate 将数据插入数据库时​​,它会删除 customer 表中的所有条目,并仅插入包含新数据的新行。我无法弄清楚是什么导致了这个问题。如果尝试通过在 session.saveOrUpdate(customer) 之后添加具有不同唯一代码的新 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配置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;
    }
<小时/>

有人可以帮我看看上述将新行插入客户表的方法出了什么问题吗?

谢谢。

最佳答案

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

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

附注;你的finally block 是空白的。您应该关闭 session 并在finally block 中编写类似的内容。

关于java - 无法使用 Hibernate 正确地将数据插入数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31794908/

相关文章:

jakarta-ee - 在两个 servlet 之间传递数据

java - 查询字符串未检索 servlet 页面中的值

java - 管理守护线程池

java - 我可以在同一个类的两个方法中使用@GET注释吗?

java - 由于未找到 DayOfWeek,Quarkus 测试在 native 中失败

servlets - 从 HttpServletRequest 获取美化后的 URL

java - 我的 Java Internet 连接检查总是失败

java - Spring 加载和连接 View

java - 是否可以从 hibernate 动态添加存储过程?

java - 迁移后 Hibernate 抛出错误(对同一集合的引用)