只有当我使用 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.
总体影响
没有任何新添加的字段被添加到架构中
我尝试了一些建议,比如
- 尝试将 Hibernate 版本从 5.2.5 更改为 5.2.8
- 将 JDBC 驱动程序更改为 com.microsoft.sqlserver 6.1.0.jre8
- 删除连接池
- 将数据源中的 ValidationQuery 设置为 SELECT 1
- 在实体中移动@Id 字段而不是在@MappedSuperclass 中
- 在 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/