【问题标题】:Mapping two entities via @OneToMany relationship fails in Struts2 action在 Struts2 操作中通过 @OneToMany 关系映射两个实体失败
【发布时间】:2014-07-26 10:28:13
【问题描述】:

假设一个产品可以有一个账户列表,产品和账户的关系是@OneToMany。在产品类中,我创建了一个 Set 接口来存储帐户。 接下来,我制作了一个使用 Struts 2 向产品添加帐户的方法。每次我运行这个方法时,HashSet 被重置并从中删除对象。在下面,您可以找到 DefaultProduct 类。

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

Struts 2 action 方法从service 类调用editProduct() 方法,该类是使用Spring 框架注入的依赖项。 service 类没有任何问题,因为它已经过准确测试。您可以在下面找到来自 service 类和 Struts 2 的方法。

服务:

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

支柱 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;
}

注意:Product是DefaultProduct类实现的接口。

非常感谢

【问题讨论】:

  • 您没有向产品添加帐户。
  • 我该怎么做?产品构造函数接受传递的 Set 并将其添加到现有的.. 有什么问题吗?
  • 是的,但您没有创建任何产品。
  • Roman 抱歉,我在写问题时打错字了。
  • 那么,问题出在哪里?服务没用?

标签: java spring jpa struts2 entitymanager


【解决方案1】:

您必须添加到一对多关联的一件事是级联类型。

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

【讨论】:

  • 感谢 Roman 提出的解决方案,但不幸的是该程序仍然无法运行。由于某种原因,当调用另一个操作方法时,添加的帐户会从产品的 HashSet 中删除。
  • 我已经发布了我的服务类中负责合并对象的方法。除此之外,它确实坚持、删除、查找对象没有任何问题。
  • 如果你想持久化你应该使用适当的方法。
  • 我不想持久化对象 Roman。最初,我使用无参数构造函数创建产品 obj,JPA 为其生成一个 ID 并将其存储在数据库中。然后,我决定为这个产品添加账户,所以我使用它的 ID 找到这个产品,然后使用上面的构造函数添加新的带有账户的 Set。
  • 首先你持久化一个没有账户的产品,他们添加账户并更新外键。
猜你喜欢
  • 1970-01-01
  • 2021-06-29
  • 1970-01-01
  • 2015-05-31
  • 2018-10-21
  • 2012-02-08
  • 2013-01-02
  • 1970-01-01
  • 2013-11-20
相关资源
最近更新 更多