我对JPA行为感到困惑。底层数据库是H2,我正在使用SpringBoot,
jpa:
hibernate:
ddl-auto: update
database-platform: org.hibernate.dialect.H2Dialect
这是我的实体:
@Entity
class ChildEntity{
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
var id: Long = _
@OneToMany(fetch = FetchType.EAGER)
var parentEntities: java.util.Set[ParentEntity] = _
}
这里是在数据库中创建的内容:
CREATE INDEX "PUBLIC"."INDEX_C" ON "PUBLIC"."CHILD_ENTITY_PARENT_ENTITIES"("CHILD_ENTITY_ID");
CREATE PRIMARY KEY "PUBLIC"."PRIMARY_KEY_CA" ON "PUBLIC"."CHILD_ENTITY_PARENT_ENTITIES"("CHILD_ENTITY_ID", "PARENT_ENTITIES_ID");
-- why?
CREATE UNIQUE INDEX "PUBLIC"."UK_INDEX_C" ON "PUBLIC"."CHILD_ENTITY_PARENT_ENTITIES"("PARENT_ENTITIES_ID");
为什么它为联接表上的PARENT_ENTITIES_ID
创建唯一索引?
这是可以预期的,一对多关系将两个不同的实体连接在一起。默认情况下,如果您未明确执行JPA,则JPA会实现此目的。这就是为什么您有一个包含两个实体的ID的联接表的原因。
Jpa自动创建联接表。
您可以使用@JoinColumn避免额外的联接表问题。@JoinColumn注释可帮助Hibernate查明父级中有一个外键列。