仅使用@mappedBy,no @ JoinColumn-在OneToMany关系中创建的联接列,那么JoinColumn的用途是什么?

时间:2019-02-23 04:12:36

标签: java hibernate jpa

我是Hibernate的新手。我与帐户和交易之间的双向映射具有OneToMany关系。我在任何一个类中都不使用@JoinColumn,在非拥有的Account类中不使用@mappedBy。而且一切正常。使用内存数据库中的H2,在“事务”表中创建新的连接列。那么在OneToMany关系中@JoinColumn的用途是什么-它仅用于单向映射吗?下面是代码。我还阅读了What's the difference between @JoinColumn and mappedBy when using a JPA @OneToMany association

作为参考
  public class Account {
        @OneToMany( mappedBy="account", cascade=CascadeType.ALL)
        List<Transaction> list= new ArrayList<Transaction>();
    }

    public class Transaction {

        @ManyToOne
        Account account;
    }

应用程序类:

        Account a = new Account("savings");

        Transaction t1 = new Transaction("shoe purchase", 45);

        t1.setAccount(a);

        a.getList().add(t1);

        accountRepository.save(a);

输出:

事务表中有一个带有外键的条目,该条目是Account表中该行中的帐号。在“交易”表中创建的ACCOUNT_ID列。

没有创建额外的表。

3 个答案:

答案 0 :(得分:0)

的使用
  

mappedBy

是启用双向关系的指令框架。由于在Transaction类上使用@ManyToOne,因此您的交易表将具有引用帐户表主键的外键。默认情况下,Hibernate根据关系映射属性的名称和主键属性的名称生成外键列的名称。在此示例中,Hibernate将使用名称为account_id的列来存储到Account实体的外键。

  

@JoinColum

可以使用,如果您想覆盖默认的外键名称,例如@JoinColum(name =“ acc_id”)

答案 1 :(得分:0)

Jpa致力于通过约定进行配置。因此,它将尽可能代您执行配置。考虑一下chcp 1252 java -jar "D:\NB82\DosCommand\dist\DosCommand.jar" REM Shows current code page is "1252". chcp 850 java -jar "D:\NB82\DosCommand\dist\DosCommand.jar" REM Shows current code page is "850". 批注,您不必将其应用于每个实体属性,仅当您必须更改有关属性的内容时才需要它。

@Column相同,当您添加@JoinColumn时,Jpa已经知道您将需要join列,因此已为您添加了该列,并且应用了外键的默认命名约定( @ManyToOne

答案 2 :(得分:0)

MappedBy指示Hibernate关联使用的密钥在关联的另一侧。在这种情况下,正在帐户表中创建ACCOUNT_ID。

这意味着,尽管您将两个表关联在一起,但是只有一个表的外键约束于另一个表。

MappedBy使您仍然可以从没有外键约束的表中关联到另一个表。