Hibernate 4 Annotation-MySQL配置错误:java.sql.SQLException:无法添加外键约束

Hibernate 4 Annotation-MySQL配置错误:java.sql.SQLException:无法添加外键约束,mysql,spring,hibernate,jpa,spring-boot,Mysql,Spring,Hibernate,Jpa,Spring Boot,当我尝试用Hibernate4-MySQL配置加载spring启动应用程序时,我遇到了一个配置stacktrace错误。我无法找出导致外键约束问题的原因非常感谢您的帮助 以下是我的三个数据库表: 主体 persistence-mysql.properties UmPersistenceJpaConfig.java 我猜,因为您没有在实体的id中标记@column,所以它采用了getter的默认属性名,即“id” 试试看, 负责人 @Id @GeneratedValue(strategy = G

当我尝试用Hibernate4-MySQL配置加载spring启动应用程序时,我遇到了一个配置stacktrace错误。我无法找出导致外键约束问题的原因非常感谢您的帮助

以下是我的三个数据库表:

主体

persistence-mysql.properties

UmPersistenceJpaConfig.java


我猜,因为您没有在实体的id中标记@column,所以它采用了getter的默认属性名,即“id”

试试看, 负责人

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
Column(name="principal_id")
private Long principal_id;
角色

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
Column(name="role_id")
private Long role_id;

我猜,因为您没有在实体的id中标记@column,所以它采用了getter的默认属性名,即“id”

试试看, 负责人

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
Column(name="principal_id")
private Long principal_id;
角色

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
Column(name="role_id")
private Long role_id;


在得到错误后,直接在mysql中运行
SHOW ENGINE INNODB STATUS
语句,它将告诉您创建外键的具体错误。这是我在我的应用程序的maven配置上执行“干净安装”时遇到的错误。我认为这是hibernate的应用程序配置问题,没有正确地与mysql对话。问题不在mysql表中。但是您是否按照@shadow的建议显示了ENGINE INNODB状态?SHOW ENGINE INNODB STATUS=外键(principal_id)引用principal(principal_id):在引用表中找不到引用列作为第一列出现的索引,表中的或列类型与引用的表中的约束不匹配。请注意,在使用>=InnoDB-4.1.12创建的表中,ENUM和SET的内部存储类型已更改,并且新表中的这些列无法引用旧表中的这些列。有关正确的外键定义,请参阅。不确定问题是什么?看来问题出在principal表上我的principal\u id对principals\u roles表的外部约束。这是我在Java实体中为主体使用的集合吗?在得到错误后,直接在mysql中运行
SHOW ENGINE INNODB STATUS
语句,它将告诉您外键创建的确切错误。这是我在应用程序的maven配置上执行“干净安装”时遇到的错误。我认为这是hibernate的应用程序配置问题,没有正确地与mysql对话。问题不在mysql表中。但是您是否按照@shadow的建议显示了ENGINE INNODB状态?SHOW ENGINE INNODB STATUS=外键(principal_id)引用principal(principal_id):在引用表中找不到引用列作为第一列出现的索引,表中的或列类型与引用的表中的约束不匹配。请注意,在使用>=InnoDB-4.1.12创建的表中,ENUM和SET的内部存储类型已更改,并且新表中的这些列无法引用旧表中的这些列。有关正确的外键定义,请参阅。不确定问题是什么?看来问题出在principal表上我的principal\u id对principals\u roles表的外部约束。这是我在Java实体中对principal使用的集合吗?谢谢您的回复。我尝试了这个新的配置,但出现了相同的错误。Dang.@John Stafford您是否有可能混合注释(字段+属性)。顺便说一句,我会尝试在属性上应用Column(name=“role\u id”),看,是的,我相当肯定我是一致的。我的at列名和实例变量都有主体id和角色id,以避免此问题。它看起来就像上面的示例,除了@Column包含在内。是的,今晚下班后让我研究我的解决方案,我将在几个小时后发布。感谢您的回复。我尝试了这个新的配置,但出现了相同的错误。Dang.@John Stafford您是否有可能混合注释(字段+属性)。顺便说一句,我会尝试在属性上应用Column(name=“role\u id”),看,是的,我相当肯定我是一致的。我的at列名和实例变量都有principal_id和role_id以避免此问题它看起来就像上面的示例,除了@Column包含在内。是的,今晚下班后让我研究一下我的解决方案,我将在几个小时后发布。
@Configuration
@EnableTransactionManagement
@ComponentScan({ "org.qlc.um.persistence" })
@PropertySource({ "persistence-mysql.properties" })
@EnableJpaRepositories(basePackages = "org.qlc.um.persistence.dao")
public class UmPersistenceJpaConfig {

@Autowired
private Environment env;

public UmPersistenceJpaConfig() {
    super();
}

// beans

@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
    final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
    em.setDataSource(dataSource());
    em.setPackagesToScan(new String[] { "org.qlc.um" });
    final HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
    em.setJpaVendorAdapter(vendorAdapter);
    em.setJpaProperties(additionalProperties());
    return em;
}

@Bean
public DataSource dataSource() {
    final DriverManagerDataSource dataSource = new DriverManagerDataSource();
    dataSource.setDriverClassName(env.getProperty("jdbc.driverClassName"));
    dataSource.setUrl(env.getProperty("jdbc.url"));
    dataSource.setUsername(env.getProperty("jdbc.username"));
    dataSource.setPassword(env.getProperty("jdbc.password"));
    return dataSource;
}

@Bean
public JpaTransactionManager transactionManager() {
    final JpaTransactionManager transactionManager = new JpaTransactionManager();
    transactionManager.setEntityManagerFactory(entityManagerFactory().getObject());
    return transactionManager;
}

@Bean
public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
    return new PersistenceExceptionTranslationPostProcessor();
}

//

final Properties additionalProperties() {
    final Properties hibernateProperties = new Properties();
    hibernateProperties.setProperty("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto", "create-drop"));
    hibernateProperties.setProperty("hibernate.dialect", env.getProperty("hibernate.dialect"));

    // setProperty("hibernate.hbm2ddl.auto", hibernateHbm2ddlAuto);
    // setProperty("hibernate.ejb.naming_strategy", org.hibernate.cfg.ImprovedNamingStrategy.class.getName());
    return hibernateProperties;
}

}
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
Column(name="principal_id")
private Long principal_id;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
Column(name="role_id")
private Long role_id;