【问题标题】:How to conceptualize @OneToMany mapping in JPA/Hibernate如何在 JPA/Hibernate 中概念化 @OneToMany 映射
【发布时间】:2020-02-09 01:08:40
【问题描述】:

我刚开始学习 JPA 和 Hibernate,我对理解在 JPA 中使用 Hibernate 阅读/概念化 @OneToMany 映射的正确方法感到困惑。

作为一个例子,假设一个账户可以有很多交易,但一个交易只能链接到一个账户。

因此,我将“帐户类/实体”的这一观点解读为“一个帐户可以有很多交易,因此我应该将 Transcation 字段标记为 @OneToMany。

从“交易类/实体”的角度来看,我认为“一个交易只能链接到一个帐户,因此我应该将交易实体中的帐户字段标记为@OneToOne”

但是从我观看的几乎所有视频视频教程和网络资源中都提到 Transactions Entity 的 Account 字段应该是 @ManyToOne 因为“许多交易可以与一个 Account 关联”这是正确的,但对我来说这只是我们相同的关系账户实体中提到的解释不同的方式,但没有说“一个交易只能链接到一个账户”的关系的另一面

如果你能帮助我理解如何阅读和如何阅读,为什么当一个实体是@OneToMany 时另一方的关系。

@Entity
public class Account {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long accountId;

    @OneToMany(cascade = CascadeType.ALL)
    private List<Transaction> transactions = new ArrayList<>();
}
@Entity
public class Transaction {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long transactId;

    @ManyToOne
    Account account;
}

【问题讨论】:

  • 嗯,一个账户可以有很多交易。所以它是一对多的。因此,逆只能是多对一的:许多交易可以拥有相同的帐户。如果是一对一的话,对方也是一对一的,所以一个账户只能有一笔交易。这是不正确的。
  • @JBNizet 所以这意味着所有 OneToMany 关系只有 MayToOne 在他们的另一边/实体?
  • 是的,它是对称的。一对多-多对一;一对一-一对一;多对多-多对多。

标签: hibernate jpa hibernate-onetomany


【解决方案1】:

我喜欢这样想:

@Entity
public class Account {
    // Here I read this as "One Account (The entity we are in) ToMany Transactions (The foreign entity)
    @OneToMany(cascade = CascadeType.ALL)
    private List<Transaction> transactions = new ArrayList<>();
}
@Entity
public class Transaction {
    // If we use the same process as above we get:
    // Many Transactions (The entity we are in) ToOne Account (The foreign entity)
    @ManyToOne
    Account account;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-24
    • 2014-04-08
    • 1970-01-01
    • 2014-11-19
    • 1970-01-01
    • 2020-04-15
    • 1970-01-01
    • 2019-03-27
    相关资源
    最近更新 更多