Java 在Struts2操作中,通过@OneToMany关系映射两个实体失败
假设一个产品可以有一个帐户列表,那么产品和帐户之间的关系是Java 在Struts2操作中,通过@OneToMany关系映射两个实体失败,java,spring,jpa,struts2,entitymanager,Java,Spring,Jpa,Struts2,Entitymanager,假设一个产品可以有一个帐户列表,那么产品和帐户之间的关系是@OneToMany。在product类中,我创建了一个Set接口来存储帐户。 接下来,我制作了一个使用Struts 2向产品添加帐户的方法。每次运行此方法时,将重置哈希集,并从中删除对象。在下面,您可以找到DefaultProduct类 @Entity public class DefaultProduct { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Colum
@OneToMany
。在product类中,我创建了一个Set接口来存储帐户。
接下来,我制作了一个使用Struts 2向产品添加帐户的方法。每次运行此方法时,将重置哈希集
,并从中删除对象。在下面,您可以找到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:
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;
}
公共字符串addAccount(){
Set accounts=new HashSet();
accounts.add(coreService.findAccountById(accountId));
editProduct(新的DefaultProduct(id、帐户));
System.out.println(coreService.findProductById(id.getAccounts().size());//大小检查
回归成功;
}
注意:产品是由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
}
非常感谢对于一对多关联,您必须添加的一件事是级联类型
@OneToMany(fetch = FetchType.LAZY, mappedBy = "product", targetEntity = DefaultAccount.class, cascade = {CascadeType.MERGE})
private final Set<Account> accounts = new HashSet<Account>();
@OneToMany(fetch=FetchType.LAZY,mappedBy=“product”,targetEntity=DefaultAccount.class,cascade={CascadeType.MERGE})
私有最终设置帐户=新HashSet();
您没有向产品中添加帐户。我如何才能做到这一点?产品构造函数获取传递的集合并将其添加到现有集合中。。有什么问题吗?是的,但是你没有创造任何产品。对不起,我在写问题的时候打错了。那么,问题是什么?服务不起作用?感谢您提出的解决方案,但不幸的是,该程序仍然不起作用。由于某些原因,在调用另一个操作方法时,添加的帐户将从产品的哈希集中删除。我已从负责合并对象的服务类中发布了该方法。除此之外,它还可以持久化、删除和查找没有任何问题的对象。如果要持久化,应使用适当的方法。我不想持久化对象。最初,我创建了一个带有无参数构造函数的产品obj,JPA为其生成一个ID并将其存储在db中。然后,我决定向该产品添加帐户,因此我使用该产品的ID找到该产品,然后使用上面的构造函数添加新的帐户集。首先,您保留一个没有帐户的产品,他们添加帐户并更新外键。