我是新手,所以请原谅我的解释和问题本身。如果您对我的方法有任何反馈建议,我将不胜感激。
用户有一个帐户->帐户具有货币列表->货币有名称和余额。
通过研究一些我的UserEntity会看起来像这样:
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@OneToOne
@JoinColumn(name = "account_id")
Account account;
2)
@Id
private Long accountId;
@OneToOne
private UserEntity userEntity;
@ManyToOne
private List<Currency> currencyList;`
3)
@Data
public class Currency
private final String name;
private final BigDecimal balance;
如果我不加入列帐户id并将其作为外键,一对一的好处是什么
正如你在上面看到的,我已经创建了Currency包装器,但只要Currency是一个实体,它就不会让我在那里,Currency在我的情况下必须是一个主体吗?或者我遗漏了什么?如何在数据库中存储的列表。这个想法是能够从账户中提取所有货币。
我想通过从UI发送post请求来实现以下目标银行账户创建
输入:●客户ID●货币清单
输出:●帐户ID●客户ID●余额列表:○可用金额○货币
这种方法还不错。最后,您必须在DB中拥有与表一样多的实体,如果数据模型是关系型的,那么一对一关系是正确的。
关于货币,如果你想把它保存在数据库中,它必须是一个实体。
如果你有这3个实体,当然你可以坚持并恢复它们。但为此,您应该进一步细化实体。例如,双向关系将丢失,正确设置类型关系并设置惰性关系:
账户主体:
@OneToMany(mappedBy="account",fetch=FetchType.LAZY) //Add lazy for performance, 1 Account N currency
private List<Currency> currencyList;`
货币实体:
@ManyToOne(fetch = FetchType.LAZY) //Add lazy for performance, 1 Account N currency
private Account account;
例如,如果您需要插入:
Account a = new Account();
a.set [....]
a.setCurrencyList(new ArrayList<>);
Currency c = new Currency();
c.set [....]
a.getCurrencyList().add(c)
entityManager.persist(a);
为了使级联插入工作,必须将以下条目添加到Account实体的currencyList属性中,因此可以嵌套N个实体。
@OneToMany(mappedBy="account",fetch=FetchType.LAZY, cascade = {CascadeType.PERSIST})
如果您还希望Account实体更新Currency,并且两者之间的关系应建立以下注释:
@OneToMany(orphanRemoval=true ,account="nece",fetch=FetchType.LAZY, cascade = {CascadeType.MERGE, CascadeType.PERSIST})
orphanRemove导致如果您从currencyList列表中删除一个Currency实体,它将自动从DB 中删除该Currency主体
您的方法很好,但您必须创建实体并对其进行审查,以便通过其注释充分发挥JPA的潜力。
此外,作为一个提示,不要在请求中发送实体,使用Orika等框架发送带有所需数据的DTO,这是一个安全错误。