2014-07-26 2 views
1

Supposons qu'un produit puisse avoir une liste de comptes, la relation entre le produit et le compte est @OneToMany. Dans la classe de produit, j'ai créé une interface Set pour stocker des comptes. Ensuite, j'ai fait une méthode utilisant Struts 2 pour ajouter des comptes à un produit. Chaque fois que j'exécute cette méthode, le HashSet est réinitialisé et les objets en sont supprimés. Ci-dessous, vous pouvez trouver la classe DefaultProduct.Le mappage de deux entités via la relation @OneToMany échoue dans l'action Struts2

@Entity 
public class DefaultProduct { 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
@Column(name = "ID", nullable = false) 
Long id; 

@OneToMany(fetch = FetchType.LAZY, mappedBy = "product", targetEntity = DefaultAccount.class) 
private final Set<Account> accounts = new HashSet<Account>(); 

public DefaultProduct(Long id, Set<Account> accounts) { 
    Assert.notEmpty(accounts); 
    this.accounts.addAll(accounts); 
} 
// Getters 
} 

La méthode Struts 2 d'action appelle la méthode editProduct() de la classe service, qui est la dépendance à l'aide Injecté framework Spring. La classe service n'a aucun problème car cela a été testé avec précision. Ci-dessous vous trouverez des méthodes de service classe et Struts 2.

Service:

@Transactional 
public void editProduct(Product product) { 
    entityManager.merge(product); 
} 

Struts 2:

public String addAccount(){ 
    Set<Account> accounts = new HashSet<Account>(); 
    accounts.add(coreService.findAccountById(accountId)); 
    coreService.editProduct(new DefaultProduct(id, accounts)); 
    System.out.println(coreService.findProductById(id).getAccounts().size()); //Size-check 
    return SUCCESS; 
} 

Note: Le produit est une interface implémentée par DefaultProduct classe.

Un grand merci

+0

Vous n'ajoutez pas de compte à un produit. –

+0

Comment puis-je le faire Roman? Le constructeur du produit prend l'ensemble passé et l'ajoute à celui existant. Y at-il quelque chose de mal? –

+0

oui, mais vous ne créez aucun produit. –

Répondre

1

Une chose que vous devez ajouter à un à plusieurs est de type cascade.

@OneToMany(fetch = FetchType.LAZY, mappedBy = "product", targetEntity = DefaultAccount.class, cascade = {CascadeType.MERGE}) 
private final Set<Account> accounts = new HashSet<Account>(); 
+0

Merci pour la solution proposée romaine, mais malheureusement, le programme ne fonctionne toujours pas. Pour une raison quelconque, le compte ajouté est supprimé du HashSet du produit lors de l'appel d'une autre méthode d'action. –

+0

Vous avez dit _La classe de service n'a aucun problème _... –

+0

J'ai posté la méthode de ma classe de service qui est responsable de la fusion des objets. En dehors de cela, il persiste, supprime, trouve des objets sans aucun problème. –

Questions connexes