Hibernate中@JoinColumn的name与referencedColumnName命名规则解惑
为什么@JoinColumn需要这样配置?
这本质是JPA中@JoinColumn两个核心属性的职责差异导致的:
name:指定的是关联表(这里是permitted_role)中外键列的数据库实际名称,所以必须和你数据库里的蛇形命名(比如notification_key)保持一致,这样JPA才能定位到数据库里对应的外键列。referencedColumnName:指定的是主实体(FooEntity,包括它的嵌入ID FooEntityId)中对应的属性名称,JPA是通过实体类的属性来映射数据库列的,你的代码里属性用的是驼峰命名(比如notificationKey),所以这里必须写驼峰的属性名,而非数据库列名。
报错的具体原因
当你把referencedColumnName写成蛇形的notification_key时,JPA会去FooEntity(包括它的嵌入ID类)里查找名为notification_key的属性,但你的代码里根本没有这个属性——只有驼峰的notificationKey,所以JPA找不到对应的映射关系,就抛出了那个“找不到列映射”的错误。
补充说明:JPA默认会把驼峰属性名自动转换为蛇形数据库列名(比如notificationKey对应notification_key),但这个转换是JPA内部的映射逻辑,referencedColumnName是直接指向实体属性的,和数据库列名没有直接关联,绝对不能混淆两者的配置规则。
内容的提问来源于stack exchange,提问作者Michael Von Bargen
相关产品推荐
相关产品推荐

