2

我有 Hibernate 映射的类,其中 ManyToOne 注释有时会导致数据库中的外键约束(我已经尝试过 Oracle 和 H2),有时不会。

例如,这里没有为 source_id 生成约束:

@Entity
@Table( name = "onto_entry" )
@Inheritance ( strategy = InheritanceType.SINGLE_TABLE )
@DiscriminatorColumn ( name = "term_category" )
@DiscriminatorValue ( "generic" )
@SequenceGenerator( name = "hibernate_seq", sequenceName = "onto_entry_seq" )
public class OntologyEntry extends Identifiable
{
  ...
  @ManyToOne ( targetEntity = ReferenceSource.class, cascade = {   
    CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH } )
  @JoinColumn( name = "source_id" )
  public ReferenceSource getSource ()
  ...
}

虽然我在这里为 protocol_id 生成了 FK 约束:

@Entity
@Table ( name = "protocol_application" )
public class ProtocolApplication extends Identifiable
{
  @ManyToOne ( cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH}, targetEntity = Protocol.class )
  @JoinColumn ( name = "protocol_id" )
  public Protocol getProtocol ()
  ...
}

难道我做错了什么?哪些因素会影响这种行为?

4

2 回答 2

2

要去回答我自己。

Hibernate 不会在 Oracle 中创建连接表索引,除非在创建模式下。所以我决定自己做,通过查看 JPA 注释部分自动化它。是我到目前为止所做的。

于 2013-10-29T11:20:45.703 回答
2

可能 hibernate.dialect 设置为 MyISAM 而不是 InnoDB

MyISAM 不支持外键。

所以设置

hibernate.dialect = org.hibernate.dialect.MySQL5InnoDBDialect

或者对于 Spring Boot

spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5InnoDBDialect
于 2019-06-11T15:25:52.303 回答