![](/img/trans.png)
[英]Log sql from hibernate if spring.jpa.hibernate.ddl-auto=update
[英]Spring Jpa Hibernate / sql
我是新手,所以请原谅我解释和问题本身。 对于我的方法的任何反馈建议,我将不胜感激。
用户有一个帐户 -> 帐户有一个货币列表 -> 货币有名称和余额。
通过研究一些我的 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 并将其作为外键存在,一对一的好处是什么
正如您在上面看到的那样,我已经创建了货币包装器,但只要货币是一个实体,它就不会让我在那里拥有它,在我的情况下,货币是否必须是一个实体,或者我错过了什么? 如何在数据库中存储列表。 这个想法是能够从账户中提取所有货币。
我想通过从 UI 银行帐户创建发送帖子请求来实现以下目标
输入: ● 客户 ID ● 货币列表
Output: ● 账户 ID ● 客户 ID ● 余额列表: ○ 可用金额 ○ 货币
方法还不错。 最后,您必须拥有与 DB 中的表一样多的实体,如果数据 model 是关系数据,则一对一关系是正确的。
关于货币,如果你想将它保存在数据库中,它必须是一个实体。
如果您拥有这 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})
orphanRemoval 导致如果您从 currencyList 列表中删除货币实体,它将自动从数据库中删除货币实体
您的方法很好,但您必须创建实体并查看它们,以便通过其注释充分发挥 JPA 的潜力。
另外作为提示,不要在请求中发送实体,使用 Orika 等框架发送带有所需数据的 DTO,这是一个安全错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.