[jboss-user] [EJB 3.0] - EJB Merge doesn't merge existing entities

atish.singh do-not-reply at jboss.com
Tue Feb 24 07:25:21 EST 2009


Hi everyone, 
 
i have a client application (Batch) which accesses a self-written EJB Service (running on jboss AS 4.2.3).
Through this EJB Service the client can retrieve Entities, and merge changes back to the DB. 
 
My Problem comes up when i try to use the EntityManager.merge() Method. Instead of overwriting the existing entity in the DB, it creates a new entry. Further i´ve noticed that the old entry has Version-Column set to 1 and the new one has Version-Column set to 0.

I also tried to upgrade to the newest hibernate version but without success.
 
Can anyone come up with a solution, how to use the merge method?  I appreciate any help!!!!  

I've attached some of my sources:

merge-method call in EJB Service-Class

  |     @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
  |     public void updateDealer(Dealer dealer) {
  |     	em.merge(dealer);
  |     	em.flush();
  |     }
  | 

getEntity / getDealer Call in EJB Service Class

  | public Dealer getDealer(int agDealerCode) {
  |         Dealer dealer = null;
  | 
  |         Query q = em.createQuery("From Dealer Where dealerNo = :dealerno");
  | 
  |         q.setParameter("dealerno", agDealerCode);
  | 
  |         try {
  |             dealer = (Dealer) q.getSingleResult();
  |         } catch (NoResultException nrEx) {
  |             // do nothing just return null value;
  |         }
  |         return dealer;
  |     }
  | 

Dealer Entity

  | package ch.hstService.client.model;
  | 
  | import java.io.Serializable;
  | import java.util.ArrayList;
  | import java.util.Collection;
  | import java.util.HashSet;
  | import java.util.Set;
  | 
  | import javax.persistence.CascadeType;
  | import javax.persistence.Column;
  | import javax.persistence.Entity;
  | import javax.persistence.FetchType;
  | import javax.persistence.GeneratedValue;
  | import javax.persistence.GenerationType;
  | import javax.persistence.Id;
  | import javax.persistence.JoinColumn;
  | import javax.persistence.OneToMany;
  | import javax.persistence.Table;
  | import javax.persistence.Version;
  | 
  | @Entity
  | @Table(schema="HAENDLERSTAMM")
  | public class Dealer implements Serializable {
  | 
  | 	/******** Properties *******/
  | 
  | 	@Id @GeneratedValue(strategy=GenerationType.SEQUENCE)
  | 	@Column(name="id_dealer")
  | 	private Long id = null;
  | 
  | 	@Version
  | 	private Long version;
  | 
  |     
  |     @Column(length=200)
  |     private String dpName;
  | 
  |     @Column(length=50)
  |     private String dealerType;
  | 
  |     @Column(name="market_name_official", length=200)
  |     private String marketNameOfficial;
  | 
  |     @Column(name="owner_dpname", length=200)
  |     private String ownerDpName;
  | 
  |     @Column(name="outlet_type_architectural", length=100)
  |     private String outletTypeArchitectural;
  | 
  |     @Column(length=200)
  |     private String name;
  | 
  |     @Column(name="additional_name", length=200)
  |     private String additionalName;
  | 
  |     @Column(name="vat_number", length=20)
  |     private String vatNumber;
  | 
  |     @Column(name="default_language", length=15)
  |     private String defaultLanguage;
  | 
  |     private int dealerNo;
  | 
  |     @Column(length=200)
  |     private String otherMakes;
  | 
  |     @OneToMany(cascade={CascadeType.ALL}, fetch=FetchType.EAGER ) 
  |     @JoinColumn(name="id_dealer",referencedColumnName = "id_dealer")
  |     private Set<Address> addresses = new HashSet<Address>();
  | 
  |     @OneToMany(cascade={CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REMOVE}, fetch=FetchType.EAGER)
  |     @JoinColumn(name="id_dealer",referencedColumnName = "id_dealer")
  |     private Set<Email> emails = new HashSet<Email>();
  | 
  |     @OneToMany(cascade={CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REMOVE }, fetch=FetchType.EAGER)
  |     @JoinColumn(name="id_dealer",referencedColumnName = "id_dealer")
  |     private Set<Phone> phones = new HashSet<Phone>();
  | 
  |     @OneToMany(mappedBy="dealer", cascade={CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REMOVE}, fetch=FetchType.EAGER)
  |     @JoinColumn(name="id_dealer")
  |     private Set<Contract> contracts = new HashSet<Contract>();
  | 
  |     @OneToMany(cascade={CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REMOVE }, fetch=FetchType.EAGER)
  |     @JoinColumn(name="id_dealer",referencedColumnName = "id_dealer")
  |     private Set<URL> urls = new HashSet<URL>();
  | 
  |     /******** Konstruktoren *******/
  | 
  |     public Dealer() {   //Paket-weiter Konstruktor
  |     }
  | 
  |     
  |     /******** Getter / Setter *******/
  | }
  | 

View the original post : http://www.jboss.org/index.html?module=bb&op=viewtopic&p=4212585#4212585

Reply to the post : http://www.jboss.org/index.html?module=bb&op=posting&mode=reply&p=4212585




More information about the jboss-user mailing list