繁体   English   中英

Spring Jpa Hibernate / sql

[英]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;
    
  1. 如果我不加入列帐户 ID 并将其作为外键存在,一对一的好处是什么

  2. 正如您在上面看到的那样,我已经创建了货币包装器,但只要货币是一个实体,它就不会让我在那里拥有它,在我的情况下,货币是否必须是一个实体,或者我错过了什么? 如何在数据库中存储列表。 这个想法是能够从账户中提取所有货币。

我想通过从 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM