2012-01-16 5 views
0

Ma classe client utilise la méthode updateCustomer en classe CustomerService:erreur constante dans Hibernate modèle mise à jour hql

Customer updatedCustomer = new Customer("2314DD0", "POJO World", "Offers POJO service."); 
    customerService.updateCustomer(updatedCustomer); 

J'ai essayé toutes sortes de choses à travailler autour de « updateOrSave », différents arguments pour la mise à jour, etc. sur. Le problème que je rencontre en fonction de la trace de la pile est un (HibernateOptimisticLockingFailureException) et un (org.hibernate.StaleStateException). Mais laissez-moi d'abord expliquer: Tous mes autres accès aux données (c'est-à-dire enregistrer, supprimer et interroger) fonctionnent parfaitement bien. Je me méfie de ma classe de domaine client, ainsi que du fichier Customer.hbm.xml que j'ai configuré.

Alors, ma classe de service à la clientèle:

public void updateCustomer(Customer updatedCustomer) 
{ 
    this.dao.update(updatedCustomer); 
} 

Service à la clientèle Dao:

public void update(Customer customerToUpdate) 
{ 
    template.update("Customer", customerToUpdate); 
} 

classe domain.Customer:

public class Customer 
{ 
private int id; 
private String customerId, companyName, email, telephone, notes; 

private Customer() {} 

public Customer(String customerId, String companyName, String email, 
       String telephone, String notes) 
{ 
    this.customerId = customerId; 
    this.companyName = companyName; 
    this.email = email; 
    this.telephone = telephone; 
    this.notes = notes; 
} 

//Getters and Setters for ALL instance variables listed after this point. 
} 

Enfin, mon Customer.hbm.xml:

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" 
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 

<hibernate-mapping> 
<class name="com.crm.domain.Customer"> 

    <id name="id" column="ID"> 
     <generator class="native"/> 
    </id> 

    <property name="customerId"/> 
    <property name="companyName"/> 
    <property name="email"/> 
    <property name="telephone"/> 
    <property name="notes"/> 
</class> 

Répondre

1

S'il s'agit d'un nouvel objet, ce qui est implicite par new Customer("2314DD0", "POJO World", "Offers POJO service.");, ne devriez-vous pas appeler save() ou persist() au lieu de update()?

+0

Ce que j'essaie de faire est de mettre à jour un client existant avec customerId de "2314DD0". Ce que j'ai fait est de remplacer l'un des paramètres du client par "POJO World". Ainsi, le client mis à jour aurait les attributs du "nouveau client", alors que le customerId et ainsi de suite sont les mêmes. C'est pourquoi j'ai cru que "mise à jour" serait plus approprié. – harryo

+0

Si vous voulez mettre à jour, vous devriez probablement charger l'objet de la base de données par ID, puis apporter les modifications, puis mettre à jour. – digitaljoel