我最近开始使用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;
}
有人可以帮助我将上述新行插入客户表的方法出现问题。
感谢。
答案 0 :(得分:0)
可能的原因可能是您的代码重新创建表格并添加记录后缀。
您是否尝试过调试并查看数据库端以查看插入之前发生了什么?
一面注意;你的finally块是空白的。你应该让你的会话结束,并在finally块中编码类似的东西。
答案 1 :(得分:0)
感谢他快速回应。
我发现了原因。更改hibernate.cfg.xml中的以下属性来自&#34;创建&#34;到&#34;验证&#34;解决了这个问题。
验证
感谢。