Недавно я начал использовать Hibernate. Я столкнулся с проблемой нижеНевозможно правильно вставить данные в базу данных с помощью Hibernate
Описание: Для клиента объекта, когда я пытаюсь вставить данные в базу данных с помощью hibernate saveOrUpdate, он удаляет все записи в таблице клиентов и вставляет только новую строку с новыми данными. Я не могу понять, что вызывает проблему. Если попытаться вставить другие данные одновременно, добавив новый объект Customer (а именно customer1) с другим уникальным CODE после session.saveOrUpdate (клиент), я получаю идентификатор уже существующего исключения.
Определение таблицы в базе данных, как показано ниже
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;
}
}
класса, выполняющего действие спящего режима, как показано ниже
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;
}
Может кто-нибудь, пожалуйста, помогите мне в том, что не так с вышеуказанным подходом к вставке новых строк в таблицу клиентов.
Спасибо.