2015-08-03 2 views
1

Недавно я начал использовать 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; 
    } 

Может кто-нибудь, пожалуйста, помогите мне в том, что не так с вышеуказанным подходом к вставке новых строк в таблицу клиентов.

Спасибо.

ответ

0

Возможной причиной может быть ваш код, воссоздающий таблицы и добавляющий записи послесловия.

Вы пробовали отлаживать и смотреть на базу данных, чтобы увидеть, что происходит перед вставкой?

с одной стороны; ваш окончательный блок пуст. У вас должно быть закрытие сессии и подобные вещи, закодированные внутри, наконец, блока.

0

Спасибо за быстрый ответ.

Я понял причину.

Изменение свойства ниже в файле hibernate.cfg.xml от "create" to "validate" разрешило проблему.

validate

Спасибо.

Смежные вопросы