2010-07-09 4 views
1

J'ai un problème avec la fusion d'objets en utilisant JPA. Mon code va comme ça.La fusion jpa ne fonctionne pas

EntityTransaction entr = em.getTransaction(); 

entr.begin(); 

Query q = em 
    .createQuery("SELECT filterName FROM IbFilterName filterName where" 
    + " filterName.filterId = 42352 "); 

List<IbFilterName> filterNameList = q.getResultList(); 

for(IbFilterName filterName : filterNameList){ 
    String values = filterName.getFilterValues(); 
    filterName.setFilterValues(values+"Saranya"); 
    em.merge(filterName); 
} 

entr.commit(); 

Et mon entité est

@Id 
@SequenceGenerator(name = "IB_FILTER_NAMES_FILTERID_GENERATOR", sequenceName = "IB_LOGIN_HISTORY_SEQ") 
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "IB_FILTER_NAMES_FILTERID_GENERATOR") 
@Column(name = "FILTER_ID") 
protected long filterId; 

@Column(name = "EXTERNAL_USER") 
protected String externalUser; 

@Column(name = "FILTER_NAME") 
protected String filterName; 

@Column(name = "FILTER_VALUES") 
protected String filterValues; 

// bi-directional many-to-one association to IbPortfolioFilterMapping 
@OneToMany(mappedBy = "ibFilterName") 
private Set<IbPortfolioFilterMapping> ibPortfolioFilterMappings; 

Quand je lance mon cas de test, la fusion ne met pas à jour mon objet filtername ainsi JPA ne se déclenche pas toute requête dans la console.

Quelqu'un peut-il s'il vous plaît conseiller ce que je fais mal ??

Répondre

2

Etes-vous sûr que la première requête récupère réellement des enregistrements? IMO, cette requête attend un long en tant que paramètre.

En outre, étant donné que vos entités ne sont pas détachés, je suggère pas fusion d'appel et laissez-JPA détecter et débusquer les changements automatiquement:

em.getTransaction().begin(); 

Query q = em 
    .createQuery("SELECT filterName FROM IbFilterName filterName WHERE" 
    + " filterName.filterId = :id ").setParameter("id", 42352L); 

List<IbFilterName> filterNameList = q.getResultList(); 

for(IbFilterName filterName : filterNameList){ 
    String values = filterName.getFilterValues(); 
    filterName.setFilterValues(values + "Saranya"); 
    //em.merge(filterName); // DON'T 
} 

em.getTransaction().commit();