Hibernate:为什么使用或不使用类似天气的字段绑定显式@JoinColum注释?

2024-03-01

Is @JoinColum当我们使用任何关联类型注释时隐式指定,例如@OneToOne, @OneToMany, etc.

这是摘自Student实体与Laptop实体

情况1)不使用显式@JoinColum

@OneToMany(cascade=CascadeType.ALL)
private List<Laptop> laptops=new ArrayList<Laptop>();  

情况 2) 使用显式@JoinColum

@OneToMany(cascade=CascadeType.ALL)
@JoinColumn
private List<Laptop> laptops=new ArrayList<Laptop>(); 

当我检查时DEBUG两种情况“几乎”相似Binding,即如下所示。

1)所以我可以假设@JoinColum隐式指定时@OneToMany是指定的吗?但是等等,我还注意到 Hibernate 试图引用一些完全奇怪的表“student_laptops”,我没有在任何地方创建它(可能是一个连接表)。

那么有人可以描述一下这里的流程到底是什么吗?

Debug: private List<Laptop> laptops=new ArrayList<Laptop>();

//You can totally ignore this. Just specifying for any reference.

DEBUG - Binding column: Ejb3JoinColumn{logicalColumnName='null', referencedColumn='null', mappedBy=''}
DEBUG - Binding column: Ejb3Column{table=org.hibernate.mapping.Table(STUDENT), mappingColumn=laptops, insertable=true, updatable=true, unique=false}
DEBUG - Binding column: Ejb3Column{table=org.hibernate.mapping.Table(STUDENT), mappingColumn=null, insertable=true, updatable=true, unique=false}
DEBUG - Binding column: Ejb3Column{table=org.hibernate.mapping.Table(STUDENT), mappingColumn=element, insertable=true, updatable=true, unique=false}
DEBUG - Binding column: Ejb3Column{table=org.hibernate.mapping.Table(STUDENT), mappingColumn=laptops_KEY, insertable=true, updatable=true, unique=false}
DEBUG - Binding column: Ejb3JoinColumn{logicalColumnName='laptops_KEY', referencedColumn='null', mappedBy='null'}
DEBUG - Binding column: Ejb3JoinColumn{logicalColumnName='null', referencedColumn='null', mappedBy=''}
DEBUG - Binding column: Ejb3JoinColumn{logicalColumnName='null', referencedColumn='null', mappedBy=''}
DEBUG - Collection role: com.infiniteskills.data.entities.Student.laptops
DEBUG - Building property laptops

当我们使用任何关联类型注释(如 @OneToOne、@OneToMany 等)时,@JoinColum 是否隐式指定。

答案是:NO。除了以下情况:mappedBy用来。

当您指定@JoinColumn or mappedBy(即使没有@JoinColumn) Hibernate 意味着您想要通过外键使用关联(没有连接表)。

当你不指定时@JoinColumnHibernate 使用连接表并为您创建它 —student_laptops在你的情况下。

您可以添加一个@JoinTable注释来强调您正在使用 jon 表这一事实。

@OneToMany(cascade = CascadeType.ALL)
@JoinTable
private List<Laptop> laptops = new ArrayList<Laptop>();  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Hibernate:为什么使用或不使用类似天气的字段绑定显式@JoinColum注释? 的相关文章

随机推荐