2014-07-26 22 views
1

假設產品可以有一個賬戶列表,產品和賬戶之間的關係是@OneToMany。在產品類中,我創建了一個存儲帳戶的Set界面。 接下來,我製作了一個使用Struts 2向賬戶添加賬戶的方法。每次運行此方法時,HashSet都會重置,並且將從中刪除對象。在下面,你可以找到DefaultProduct類。通過@OneToMany關係映射兩個實體在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 
} 

撐杆2動作方法調用從service類,它是依賴使用Spring框架注入editProduct()方法。 service類沒有任何問題,因爲這已經過精確測試。下面你可以找到service類和Struts 2的方法

服務:

@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; 
} 

注:產品是DefaultProduct類實現的接口。

非常感謝

+0

您並未將帳戶添加到產品。 –

+0

我該怎麼做羅馬?產品構造函數接受傳遞的Set並將其添加到現有的..有什麼問題嗎? –

+0

是的,但你沒有創建任何產品。 –

回答

1

您必須添加到一對多關聯的一件事是級聯類型。

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

感謝您提出的解決方案羅馬,但不幸的是,該方案仍然無法正常工作。出於某種原因,在調用其他操作方法時,添加的帳戶將從產品的HashSet中刪除。 –

+0

你說_服務類沒有任何問題_... –

+0

我已經發布了我的服務類負責合併對象的方法。除此之外,它會堅持,刪除,找到沒有任何問題的對象。 –