2016-08-18 2 views
0

J'ai un problème dans les opérations de base de CRUD sur une base de données dans mon application J2EE.Pourquoi ma méthode update() crée-t-elle une nouvelle instance?

Entité:

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
@Basic(optional = false) 
@Column(name = "shop_id") 

Façade:

public abstract class AbstractFacade<T> { 

private Class<T> entityClass; 

    public void edit(T entity) { 
     getEntityManager().merge(entity); 
    } 
} 

Controller (j'ai ajouté de S.out pour voir ce qui se passe):

public String updateShop(Shop shop){ 
    System.out.println("Update "); 
    System.out.println(this.shop.getName()+" - ID: "+ this.shop.getShopId()); 
    this.shop = shop; 
    return "updateShop"; 
} 

public String updateShop(){ 
    System.out.println("UpdateClick "); 
    System.out.println(this.shop.getName()+" - ID: "+ this.shop.getShopId()); 
    this.shopfacade.edit(this.shop); 
    return "shops"; 
} 

Et quand je clique sur la mise à jour, un Une nouvelle instance est créée au lieu de modifier celle existante. Ceci est la sortie du journal du serveur:

Info: Update 
Info: Name - 41 
Info: UpdateClick 
Info: ChangedName - null 

Donc, l'Id disparaît en quelque sorte. Cela se produit au moment où j'appelle updateShop(), parce que j'affiche l'ID sur ma page JSF et cela fonctionne très bien.

<h:outputText value="#{shopController.shop.shopId}" title="shopId" /> 

Une idée de ce qui se passe?

Merci.

+0

Nous avons besoin de voir le reste de votre jsf pour savoir ce qui lie à ce magasin – Miles

+0

bien, problème commun dans Jsf, si vous n'avez pas lier l'objet correctement. afficher le code JSF et le contrôleur correctement si vous n'avez pas résolu le problème .. –

Répondre

0

L'un de vos problèmes est que javax.persistence.EntityManager.merge renvoie un objet d'entité - que votre code ignore.

Cette entité retournée peut être ou ne pas être la même que celle que vous transmettez. Généralement, si le contexte de persistance actuel a déjà une référence à l'entité que vous transmettez, ce sera celui qui est retourné.

Par conséquent, updateShop() devrait probablement être quelque chose comme:

public String updateShop(){ 
    System.out.println("UpdateClick "); 
    System.out.println(this.shop.getName()+" - ID: "+ this.shop.getShopId()); 
    this.shop = this.shopfacade.edit(this.shop); 
    return "shops"; 
} 

En second lieu, le passage d'un haricot d'entité sans une clé primaire à merge est effectivement la même que le passage à persist. Par conséquent si JSF a dû new son propre objet Shop parce que vous n'en avez pas fourni un existant alors vous obtiendrez l'effet dupliqué que vous voyez.