EJB Merge doesn't merge existing entities
atish.singh Feb 24, 2009 7:25 AMHi 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 *******/
}