java - hibernate : MS SQL 2012 Strange Behavior with hbm2ddl. 自动=更新

标签 java sql-server spring hibernate

只有当我使用 MS SQL 时,我的应用程序才会遇到以下问题

范围

hibernate :5.2.8.Final

MS SQL 服务器:2012

JDBC 驱动:net.sourceforge.jtds 1.3.1

Spring :4.3.7.RELEASE

Java:1.8.0.121

问题 当我为应用程序使用新的架构时,所有表和关系都已成功创建。但是如果我在实体中添加一个新字段,Hibernate 会尝试在所有表上运行这种查询

alter table A add constraint FKh20u37tju4rdvm3kmhve8fu8e foreign key (last_modified_by_id) references B

结果

Caused by: java.sql.SQLException: There is already an object named 'FKh20u37tju4rdvm3kmhve8fu8e' in the database.

总体影响

没有任何新添加的字段被添加到架构中

我尝试了一些建议,比如

  1. 尝试将 Hibernate 版本从 5.2.5 更改为 5.2.8
  2. 将 JDBC 驱动程序更改为 com.microsoft.sqlserver 6.1.0.jre8
  3. 删除连接池
  4. 将数据源中的 ValidationQuery 设置为 SELECT 1
  5. 在实体中移动@Id 字段而不是在@MappedSuperclass 中
  6. 在 Hibernate Config 中设置默认架构

但没有任何效果。但是,如果我使用 MYSQL 而不是 MS SQL,一切都会正常运行

我在下面粘贴了一些实体和 Hibernate 配置

基础实体类被每个实体扩展

@MappedSuperclass
public abstract class AbstractEntity implements Serializable {

private static final long serialVersionUID = 6486192088436426369L;

protected Long id;

private UserInfo createdBy;
private Long createdById;
private Date creationDatetime;

private UserInfo lastModifiedBy;
private Long lastModifiedById;

private Date lastModifiedDatetime;

public AbstractEntity() {
}

public AbstractEntity(UserInfo createdBy, Date creationDatetime,
        UserInfo lastModifiedBy, Date lastModifiedDatetime) {
    super();
    this.createdBy = createdBy;
    this.creationDatetime = creationDatetime;
    this.lastModifiedBy = lastModifiedBy;
    this.lastModifiedDatetime = lastModifiedDatetime;
}

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(unique = true, nullable = false)
public Long getId() {
    return id;
}

public void setId(Long id) {
    this.id = id;
}

@ManyToOne(fetch = FetchType.LAZY,cascade=CascadeType.ALL)
@JoinColumn(name = "createdById", nullable = false, insertable = false, updatable = false)
public UserInfo getCreatedBy() {
    return createdBy;
}

public void setCreatedBy(UserInfo createdBy) {
    this.createdBy = createdBy;
}

@Column(name = "createdById", insertable = true, updatable = true)
public Long getCreatedById() {
    return createdById;
}

public void setCreatedById(Long createdById) {
    this.createdById = createdById;
}

public Date getCreationDatetime() {
    return creationDatetime;
}

public void setCreationDatetime(Date creationDatetime) {
    this.creationDatetime = creationDatetime;
}

@ManyToOne(fetch = FetchType.LAZY,cascade=CascadeType.ALL)
@JoinColumn(name = "lastModifiedById", nullable = false, insertable = false, updatable = false)
public UserInfo getLastModifiedBy() {
    return lastModifiedBy;
}

public void setLastModifiedBy(UserInfo lastModifiedBy) {
    this.lastModifiedBy = lastModifiedBy;
}

@Column(name = "lastModifiedById", insertable = true, updatable = true)
public Long getLastModifiedById() {
    return lastModifiedById;
}

public void setLastModifiedById(Long lastModifiedById) {
    this.lastModifiedById = lastModifiedById;
}

public Date getLastModifiedDatetime() {
    return lastModifiedDatetime;
}

public void setLastModifiedDatetime(Date lastModifiedDatetime) {
    this.lastModifiedDatetime = lastModifiedDatetime;
}

}

实体

@Entity
public class Company extends AbstractEntity{

/**
 * 
 */
private static final long serialVersionUID = 8145899358902689000L;

private String name;

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}
}

DAO 配置

@Configuration
@EnableTransactionManagement
public class DaoSQLConfiguration {

@Value("${jdbc.database.driver.class.name}")
public String DB_DRIVER;

@Value("${jdbc.database.url}")
public String DB_URL;

@Value("${jdbc.database.schema}")
public String DB_SCHEMA;

@Value("${jdbc.database.username}")
public String DB_USER;

@Value("${jdbc.database.password}")
public String DB_PASSWORD;

@Value("${jdbc.database.maxPoolSize}")
public int DB_MAX_POOL_SIZE;

@Value("${jdbc.database.minPoolSize}")
public int DB_MIN_POOL_SIZE;

@Value("${hibernate.dialect}")
public String HIBERNATE_DIALECT;

@Value("${hibernate.show.sql}")
public String HIBERNATE_SHOW_SQL;

@Value("${hibernate.hbm2ddl.auto}")
public String HIBERNATE_HBM2DDL_AUTO;

@Resource
private EntityInterceptor entityInterceptor;

@Bean
public HibernateTransactionManager transactionManager(SessionFactory sessionFactory) {
    HibernateTransactionManager transactionManager = new HibernateTransactionManager();
    transactionManager.setSessionFactory(sessionFactory);
    return transactionManager;
}

@Bean
public HibernateTemplate hibernateTemplate(SessionFactory sessionFactory) {
    HibernateTemplate hibernateTemplate = new HibernateTemplate(sessionFactory);
    hibernateTemplate.setCheckWriteOperations(false);
    return hibernateTemplate;
}

@Bean
public LocalSessionFactoryBean getSessionFactory(DataSource dataSource) {
    LocalSessionFactoryBean sessionFactoryBean = new LocalSessionFactoryBean();
    sessionFactoryBean.setDataSource(dataSource);
    sessionFactoryBean.setHibernateProperties(getHibernateProperties());
    sessionFactoryBean.setPhysicalNamingStrategy(new ImprovedNamingStrategy());
    sessionFactoryBean.setPackagesToScan(new String[] { "com.entities" });
    sessionFactoryBean.setEntityInterceptor(entityInterceptor);
    return sessionFactoryBean;
}

@Bean
public Properties getHibernateProperties() {
    Properties properties = new Properties();
    properties.put("hibernate.dialect", HIBERNATE_DIALECT);
    properties.put("hibernate.show_sql", HIBERNATE_SHOW_SQL);
    properties.put("hibernate.hbm2ddl.auto", HIBERNATE_HBM2DDL_AUTO);
    properties.put("hibernate.physical_naming_strategy", "com.hipzone.sam.dao.sql.ImprovedNamingStrategy");
    properties.put("hibernate.enable_lazy_load_no_trans", "true");


    return properties;
}

@Bean
public DataSource dataSource() throws PropertyVetoException {


    ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();

    comboPooledDataSource.setDriverClass(DB_DRIVER);
    comboPooledDataSource.setJdbcUrl(DB_URL + "/" + DB_SCHEMA);
    comboPooledDataSource.setUser(DB_USER);
    comboPooledDataSource.setPassword(DB_PASSWORD);
    comboPooledDataSource.setMaxPoolSize(DB_MAX_POOL_SIZE);


    return comboPooledDataSource;

}

}

配置属性

jdbc.database.driver.class.name=net.sourceforge.jtds.jdbc.Driver
jdbc.database.url=jdbc:jtds:sqlserver://127.0.0.1:1433
jdbc.database.schema=test
jdbc.database.username=sa
jdbc.database.password=
jdbc.database.maxPoolSize=5
jdbc.database.minPoolSize=1

#Hibernate
hibernate.dialect=org.hibernate.dialect.SQLServer2012Dialect
hibernate.show.sql=true
hibernate.hbm2ddl.auto=update

完全异常

Hibernate: alter table user_info add constraint FK7gdskowpafinvcqig7p419prj foreign key (created_by_id) references user_info
WARN  19-Mar-17 00:48:58 ExceptionHandlerLoggedImpl:handleException:27 GenerationTarget encountered exception accepting command : Error executing DDL via JDBC Statement
org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL via JDBC Statement
    at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:67)
    at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.applySqlString(AbstractSchemaMigrator.java:525)
    at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.applySqlStrings(AbstractSchemaMigrator.java:470)
    at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.applyForeignKeys(AbstractSchemaMigrator.java:429)
    at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.performMigration(AbstractSchemaMigrator.java:245)
    at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.doMigration(AbstractSchemaMigrator.java:110)
    at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:183)
    at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:72)
    at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:309)
    at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:445)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:710)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:726)
    at org.springframework.orm.hibernate5.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:511)
    at org.springframework.orm.hibernate5.LocalSessionFactoryBean.afterPropertiesSet(LocalSessionFactoryBean.java:495)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1687)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1624)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
    at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:208)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1138)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1066)
    at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:835)
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:741)
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:467)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1173)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1067)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:513)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
    at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.autowireResource(CommonAnnotationBeanPostProcessor.java:522)
    at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.getResource(CommonAnnotationBeanPostProcessor.java:496)
    at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor$ResourceElement.getResourceToInject(CommonAnnotationBeanPostProcessor.java:627)
    at org.springframework.beans.factory.annotation.InjectionMetadata$InjectedElement.inject(InjectionMetadata.java:169)
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)
    at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessPropertyValues(CommonAnnotationBeanPostProcessor.java:318)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1264)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
    at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.autowireResource(CommonAnnotationBeanPostProcessor.java:522)
    at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.getResource(CommonAnnotationBeanPostProcessor.java:496)
    at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor$ResourceElement.getResourceToInject(CommonAnnotationBeanPostProcessor.java:627)
    at org.springframework.beans.factory.annotation.InjectionMetadata$InjectedElement.inject(InjectionMetadata.java:169)
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)
    at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessPropertyValues(CommonAnnotationBeanPostProcessor.java:318)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1264)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
    at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.autowireResource(CommonAnnotationBeanPostProcessor.java:522)
    at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.getResource(CommonAnnotationBeanPostProcessor.java:496)
    at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor$ResourceElement.getResourceToInject(CommonAnnotationBeanPostProcessor.java:627)
    at org.springframework.beans.factory.annotation.InjectionMetadata$InjectedElement.inject(InjectionMetadata.java:169)
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)
    at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessPropertyValues(CommonAnnotationBeanPostProcessor.java:318)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1264)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:761)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:866)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:542)
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:443)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:325)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4810)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5255)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.StandardContext.reload(StandardContext.java:3831)
    at org.apache.catalina.loader.WebappLoader.backgroundProcess(WebappLoader.java:292)
    at org.apache.catalina.core.StandardContext.backgroundProcess(StandardContext.java:5616)
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1377)
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1381)
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1381)
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1349)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.sql.SQLException: There is already an object named 'FK7gdskowpafinvcqig7p419prj' in the database.
    at net.sourceforge.jtds.jdbc.SQLDiagnostic.addDiagnostic(SQLDiagnostic.java:372)
    at net.sourceforge.jtds.jdbc.TdsCore.tdsErrorToken(TdsCore.java:2988)
    at net.sourceforge.jtds.jdbc.TdsCore.nextToken(TdsCore.java:2421)
    at net.sourceforge.jtds.jdbc.TdsCore.getMoreResults(TdsCore.java:671)
    at net.sourceforge.jtds.jdbc.JtdsStatement.processResults(JtdsStatement.java:613)
    at net.sourceforge.jtds.jdbc.JtdsStatement.executeSQL(JtdsStatement.java:572)
    at net.sourceforge.jtds.jdbc.JtdsStatement.executeImpl(JtdsStatement.java:809)
    at net.sourceforge.jtds.jdbc.JtdsStatement.execute(JtdsStatement.java:1282)
    at com.mchange.v2.c3p0.impl.NewProxyStatement.execute(NewProxyStatement.java:1006)
    at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:54)
    ... 91 more

最佳答案

升级你的hibernate版本到5.4.3.Final,这个问题就解决了。

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>5.4.3.Final</version>
    </dependency>

您可以在此处找到 hibernate 5.4.3.Final 的 Maven 存储库:Hibernate's core ORM Maven repository

关于java - hibernate : MS SQL 2012 Strange Behavior with hbm2ddl. 自动=更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42879027/

相关文章:

java - 使用 PhoneStateListener 打开扬声器

networking - 如何使用Java获取系统IP?

java - AbstractSecurityWebApplicationInitializer 与 AbstractAnnotationConfigDispatcherServletInitializer

java - Thymeleaf 包含带有自己的 Controller 的模板

java - Spring 的 GET 端点中的 ImmutableSet 与 AngularJS

java - Google Cloud Speech to Text 错误 : java. lang.NoSuchMethodError: No virtual method build()Lcom/google/protobuf/GeneratedMessageLite;

java - Gson - 解析具有不同字段名称和字段数量的 json

c# - Sql Server 以编程方式从远程客户端还原/备份数据库

sql-server - 使用SSIS在数据中使用多个双引号将csv文件导入SQL Server

sql-server - SQL Server Developer Edition 可以安装在 Windows 7 Home Premium 上吗?