spring应用程序启动验证具有错误数据库表的实体

jqjz2hbq  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(326)

我有两个数据库在mysql服务器名为 Database1 & Database2 . Database1 有一张table Database1.dummy_table 带主键 Database1.dummy_table.id 作为整数和 Database2 有一张table Database2.dummy_table 带主键 Database2.dummy_table.id 作为biginteger。
我的spring配置文件如下:;

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:tx="http://www.springframework.org/schema/tx"
  5. xmlns:context="http://www.springframework.org/schema/context" default-lazy-init="true"
  6. xsi:schemaLocation="http://www.springframework.org/schema/beans
  7. http://www.springframework.org/schema/beans/spring-beans.xsd
  8. http://www.springframework.org/schema/tx
  9. http://www.springframework.org/schema/tx/spring-tx.xsd
  10. http://www.springframework.org/schema/context
  11. http://www.springframework.org/schema/context/spring-context.xsd">
  12. <context:annotation-config/>
  13. <bean id="entityManagerFactoryBean" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
  14. <property name="dataSource" ref="dataSource" />
  15. <property name="persistenceUnitName" value="default"/>
  16. <property name="packagesToScan" value="com.springapp.mvc.entity" />
  17. <property name="jpaVendorAdapter">
  18. <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
  19. </property>
  20. <property name="jpaProperties">
  21. <props>
  22. <prop key="hibernate.hbm2ddl.auto">validate</prop>
  23. <prop key="hibernate.dialect">com.springapp.dialect.Mysql5CustomDialect</prop>
  24. </props>
  25. </property>
  26. </bean>
  27. <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
  28. <property name="driverClassName" value="com.mysql.cj.jdbc.Driver" />
  29. <property name="url" value="jdbc:mysql://127.0.0.1:3306/Database1" />
  30. <property name="username" value="root" />
  31. <property name="password" value="" />
  32. </bean>
  33. <tx:annotation-driven transaction-manager="transactionManager"/>
  34. <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
  35. <property name="entityManagerFactory" ref="entityManagerFactoryBean" />
  36. </bean>
  37. <bean id="persistenceExceptionTranslationPostProcessor" class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />
  38. </beans>

在我的实体类id是整数,因为我正在连接 Database1 但是在服务器启动期间(tomcat7.0.91),我遇到了以下异常:;

  1. org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactoryBean' defined in ServletContext resource [/WEB-INF/config/repository-context.xml]: Invocation of init method failed; nested exception is org.hibernate.HibernateException: Wrong column type in Database2.dummy_table for column ID. Found: bigint, expected: integer
  2. at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1628)
  3. at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555)
  4. at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
  5. at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
  6. at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
  7. at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
  8. at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
  9. at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1078)
  10. at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:857)
  11. at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:543)
  12. at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:443)
  13. at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:325)
  14. at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107)
  15. at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:5157)
  16. at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5680)
  17. at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
  18. at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:1018)
  19. at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:994)
  20. at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:652)
  21. at org.apache.catalina.startup.HostConfig.manageApp(HostConfig.java:1900)
  22. at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  23. at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
  24. at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  25. at java.lang.reflect.Method.invoke(Method.java:498)
  26. at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:301)
  27. at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
  28. at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)
  29. at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:619)
  30. at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:566)
  31. at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  32. at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
  33. at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  34. at java.lang.reflect.Method.invoke(Method.java:498)
  35. at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:301)
  36. at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
  37. at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)
  38. at javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1468)
  39. at javax.management.remote.rmi.RMIConnectionImpl.access$300(RMIConnectionImpl.java:76)
  40. at javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1309)
  41. at javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1401)
  42. at javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:829)
  43. at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  44. at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
  45. at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  46. at java.lang.reflect.Method.invoke(Method.java:498)
  47. at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:357)
  48. at sun.rmi.transport.Transport$1.run(Transport.java:200)
  49. at sun.rmi.transport.Transport$1.run(Transport.java:197)
  50. at java.security.AccessController.doPrivileged(Native Method)
  51. at sun.rmi.transport.Transport.serviceCall(Transport.java:196)
  52. at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:573)
  53. at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:834)
  54. at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:688)
  55. at java.security.AccessController.doPrivileged(Native Method)
  56. at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:687)
  57. at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
  58. at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
  59. at java.lang.Thread.run(Thread.java:748)
  60. Caused by: org.hibernate.HibernateException: Wrong column type in Database2.dummy_table for column ID. Found: bigint, expected: integer
  61. at org.hibernate.mapping.Table.validateColumns(Table.java:372)
  62. at org.hibernate.cfg.Configuration.validateSchema(Configuration.java:1338)
  63. at org.hibernate.tool.hbm2ddl.SchemaValidator.validate(SchemaValidator.java:155)
  64. at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:525)
  65. at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1859)
  66. at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:852)
  67. at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:845)
  68. at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.withTccl(ClassLoaderServiceImpl.java:398)
  69. at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:844)
  70. at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:60)
  71. at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:353)
  72. at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:370)
  73. at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:359)
  74. at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1687)
  75. at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1624)
  76. ... 57 more

如果我改变 Database2.dummy_table.id 整型或删除架构 Database2 应用程序运行良好。服务器如何验证的表 Database2 ? 我正在使用 Spring 4.3.10.RELEASE , Hibernate 4.3.7.Final & Mysql 8.0.12 .
database1表脚本:

  1. CREATE TABLE `dummy_table` (
  2. `ID` INT NOT NULL AUTO_INCREMENT,
  3. `MeterNo` VARCHAR(45) NOT NULL,
  4. `Status` INT NOT NULL,
  5. PRIMARY KEY (`ID`));

database2表脚本:

  1. CREATE TABLE `dummy_table` (
  2. `ID` BIGINT NOT NULL AUTO_INCREMENT,
  3. `MeterNo` VARCHAR(45) NOT NULL,
  4. `Status` INT NOT NULL,
  5. PRIMARY KEY (`ID`));

我的应用程序中的实体:

  1. @Entity
  2. @Table(name = "dummy_table")
  3. public class DummyTable implements Serializable {
  4. @Id
  5. @GeneratedValue(strategy = GenerationType.AUTO)
  6. @Column(name = "ID")
  7. private Integer id;
  8. @Column(name = "MeterNo")
  9. private String meterNo;
  10. @Column(name = "Status")
  11. private Integer status;
  12. public Integer getId() {
  13. return id;
  14. }
  15. public void setId(Integer id) {
  16. this.id = id;
  17. }
  18. public String getMeterNo() {
  19. return meterNo;
  20. }
  21. public void setMeterNo(String meterNo) {
  22. this.meterNo = meterNo;
  23. }
  24. public Integer getStatus() {
  25. return status;
  26. }
  27. public void setStatus(Integer status) {
  28. this.status = status;
  29. }
  30. }
but5z9lq

but5z9lq1#

必须使用正确的架构或目录对实体进行注解:
尝试使用默认目录调整您的配置:

  1. <property name="jpaProperties">
  2. <props>
  3. <prop key="hibernate.hbm2ddl.auto">validate</prop>
  4. <prop key="hibernate.dialect">com.springapp.dialect.Mysql5CustomDialect</prop>
  5. <prop key="hibernate.default_catalog">Database1</prop>
  6. </props>
  7. </property>

或者,您应该定义并使用只能访问database1的mysql用户,而不是使用 root . 这样,hibernate将不会“看到”database2,因此不会尝试将database2.u表Map到实体。

m3eecexj

m3eecexj2#

将实体更改为:

  1. @Entity
  2. @Table(catalog = "Database1", name = "dummy_table")
  3. public class DummyTable implements Serializable {

相关问题