我是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列。
没有创建额外的表。
答案 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
使您仍然可以从没有外键约束的表中关联到另一个表。