基于休眠注释类创建数据库模式

如何解决基于休眠注释类创建数据库模式

| 我有两个持久性类:User.java,Role.java,它们在hibernate.cfg.xml中声明。我正在用弹簧。 applicationContext.xml具有:
<bean id=\"transactionManager\" class=\"org.springframework.orm.hibernate3.HibernateTransactionManager\">
    <property name=\"sessionFactory\" ref=\"sessionFactory\"/>
</bean>
<bean id=\"dataSource\" class=\"info.ems.datasource.DataSourceFactory\">
    <property name=\"driverClassName\" value=\"${database.driver}\"/>
    <property name=\"url\" value=\"${database.url}\"/>
    <property name=\"username\" value=\"${database.username}\"/>
    <property name=\"password\" value=\"${database.password}\"/>
    <property name=\"validationQuery\" value=\"${database.validationQuery}\"/>
    <property name=\"dataSourceJndiName\" value=\"${database.datasource.jndiname}\"/>
</bean>     
<bean id=\"sessionFactory\" class=\"org.springframework.orm.hibernate3.LocalSessionFactoryBean\">
    <property name=\"dataSource\" ref=\"dataSource\"/>
    <property name=\"configLocation\">
        <value>/WEB-INF/hibernate.cfg.xml</value>
    </property>
    <property name=\"configurationClass\">
        <value>org.hibernate.cfg.AnnotationConfiguration</value>
    </property>
    <property name=\"hibernateProperties\">
        <props>
            <prop key=\"hibernate.dialect\">${hibernate.dialect}</prop>        
            <prop key=\"hibernate.show_sql\">${hibernate.show_sql}</prop>     
        </props>
    </property>
</bean>
<bean id=\"dao\" class=\"info.ems.hibernate.HibernateEMSDao\" init-method=\"createSchema\">
    <property name=\"hibernateTemplate\">
        <bean class=\"org.springframework.orm.hibernate3.HibernateTemplate\">
            <property name=\"sessionFactory\" ref=\"sessionFactory\"/>
            <property name=\"flushMode\">
                <bean id=\"org.springframework.orm.hibernate3.HibernateAccessor.FLUSH_COMMIT\" class=\"org.springframework.beans.factory.config.FieldRetrievingFactoryBean\"/>                    
            </property>
        </bean>
    </property>  
    <property name=\"schemaHelper\">
        <bean class=\"info.ems.hibernate.SchemaHelper\">                
            <property name=\"driverClassName\" value=\"${database.driver}\"/>
            <property name=\"url\" value=\"${database.url}\"/>
            <property name=\"username\" value=\"${database.username}\"/>
            <property name=\"password\" value=\"${database.password}\"/>
            <property name=\"hibernateDialect\" value=\"${hibernate.dialect}\"/>   
            <property name=\"dataSourceJndiName\" value=\"${database.datasource.jndiname}\"/>
        </bean>                
    </property>              
</bean>    
DataSourceFactory.java:
public class DataSourceFactory implements FactoryBean,DisposableBean {

    /** The logger. */
    private final Logger logger = LoggerFactory.getLogger(getClass());

    /** The driver class name. */
    private String driverClassName;

    /** The url. */
    private String url;

    /** The username. */
    private String username;

    /** The password. */
    private String password;

    /** The validation query. */
    private String validationQuery;

    /** The data source jndi name. */
    private String dataSourceJndiName;

    /** The data source. */
    private DataSource dataSource;

    /**
     * Sets the driver class name.
     * 
     * @param driverClassName
     *            the new driver class name
     */
    public void setDriverClassName(String driverClassName) {
        this.driverClassName = driverClassName;
    }

    /**
     * Sets the url.
     * 
     * @param url
     *            the new url
     */
    public void setUrl(String url) {
        this.url = url;
    }

    /**
     * Sets the username.
     * 
     * @param username
     *            the new username
     */
    public void setUsername(String username) {
        this.username = username;
    }

    /**
     * Sets the password.
     * 
     * @param password
     *            the new password
     */
    public void setPassword(String password) {
        this.password = password;
    }

    /**
     * Sets the validation query.
     * 
     * @param validationQuery
     *            the new validation query
     */
    public void setValidationQuery(String validationQuery) {
        this.validationQuery = validationQuery;
    }

    /**
     * Sets the data source jndi name.
     * 
     * @param dataSourceJndiName
     *            the new data source jndi name
     */
    public void setDataSourceJndiName(String dataSourceJndiName) {
        this.dataSourceJndiName = dataSourceJndiName;
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.springframework.beans.factory.FactoryBean#getObject()
     */
    @Override
    public Object getObject() throws Exception {
        if (StringUtils.hasText(dataSourceJndiName)) {
            logger.info(\"JNDI datasource requested,looking up datasource from JNDI name: \'\" + dataSourceJndiName + \"\'.\");
            JndiObjectFactoryBean jndiObjectFactoryBean = new JndiObjectFactoryBean();
            jndiObjectFactoryBean.setJndiName(dataSourceJndiName);
            jndiObjectFactoryBean.setResourceRef(true);
            try {
                jndiObjectFactoryBean.afterPropertiesSet();
            } catch (Exception e) {
                logger.error(\"datasource init from JNDI failed : \" + e);
                logger.error(\"Aborting application startup.\");
                throw new RuntimeException(e);
            }
            dataSource = (DataSource) jndiObjectFactoryBean.getObject();
        } else if (url.startsWith(\"jdbc:hsqldb:file\")) {
            logger.info(\"Embedded HSQLDB mode detected,switching on spring single connection data source.\");
            SingleConnectionDataSource singleConnectionDataSource = new SingleConnectionDataSource();
            singleConnectionDataSource.setUrl(url);
            singleConnectionDataSource.setDriverClassName(driverClassName);
            singleConnectionDataSource.setUsername(username);
            singleConnectionDataSource.setPassword(password);
            singleConnectionDataSource.setSuppressClose(true);
            dataSource = singleConnectionDataSource;
        } else {
            logger.info(\"Not using embedded HSQLDB or JNDI datasource,switching on Apache DBCP data source connection pooling.\");
            BasicDataSource basicDataSource = new BasicDataSource();
            basicDataSource.setUrl(url);
            basicDataSource.setDriverClassName(driverClassName);
            basicDataSource.setUsername(username);
            basicDataSource.setPassword(password);
            basicDataSource.setValidationQuery(validationQuery);
            basicDataSource.setTestOnBorrow(false);
            basicDataSource.setTestWhileIdle(true);
            basicDataSource.setTimeBetweenEvictionRunsMillis(600000);
            dataSource = basicDataSource;
        }
        return dataSource;
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.springframework.beans.factory.FactoryBean#getObjectType()
     */
    @Override
    public Class<?> getObjectType() {
        return DataSource.class;
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.springframework.beans.factory.FactoryBean#isSingleton()
     */
    @Override
    public boolean isSingleton() {
        return true;
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.springframework.beans.factory.DisposableBean#destroy()
     */
    @Override
    public void destroy() throws Exception {
        if (dataSource instanceof SingleConnectionDataSource) {
            logger.info(\"Attempting to shut down embedded HSQLDB database.\");
            Connection connection = dataSource.getConnection();
            Statement statement = connection.createStatement();
            statement.executeUpdate(\"SHUTDOWN\");
            statement.close();
            connection.close();
            logger.info(\"Embedded HSQLDB database shut down successfully.\");
        } else if (dataSource instanceof BasicDataSource) {
            logger.info(\"Attempting to close Apache DBCP data source.\");
            ((BasicDataSource) dataSource).close();
            logger.info(\"Apache DBCP data source closed successfully.\");
        } else {
            logger.info(\"Context shutting down for JNDI datasource.\");
        }
    }
}
HibernateEMSDao.java:
public class HibernateEMSDao extends HibernateDaoSupport implements EMSDao {

    private final Logger logger = LoggerFactory.getLogger(getClass());

    private SchemaHelper schemaHelper;

    public void setSchemaHelper(SchemaHelper schemaHelper) {
        this.schemaHelper = schemaHelper;
    }

    public void storeUser(User user) {
        getHibernateTemplate().merge(user);
    }

    public void createSchema() {
        try {
            getHibernateTemplate().find(\"from User user where user.id = 1\");
        } catch (Exception e) {
            logger.warn(\"expected database schema does not exist,will create. Error is: \" + e.getMessage());
            schemaHelper.createSchema();
            User admin = new User();
            admin.setUsername(\"admin\");
            admin.setName(\"Admin\");
            admin.setEmail(\"admin\");
            admin.setPassword(\"21232f297a57a5a743894a0e4a801fc3\");          
            logger.info(\"inserting default admin user into database\");
            storeUser(admin);
            logger.info(\"schema creation complete\");
            return;
        }
        logger.info(\"database schema exists,normal startup\");
    }
}
SchemaHelper.java:
public class SchemaHelper {

    private final Logger logger = LoggerFactory.getLogger(getClass());

    private String driverClassName;
    private String url;
    private String username;
    private String password;
    private String hibernateDialect;
    private String dataSourceJndiName;

    public void setDriverClassName(String driverClassName) {
        this.driverClassName = driverClassName;
    }

    public void setHibernateDialect(String hibernateDialect) {
        this.hibernateDialect = hibernateDialect;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public void setDataSourceJndiName(String dataSourceJndiName) {
        this.dataSourceJndiName = dataSourceJndiName;
    }

    /**
     * create tables using the given Hibernate configuration
     */
    public void createSchema() {        
        AnnotationConfiguration configuration = new AnnotationConfiguration();
        if (StringUtils.hasText(\"dataSourceJndiName\")) {
            configuration.setProperty(\"hibernate.connection.datasource\",dataSourceJndiName);
        } else {
            configuration.setProperty(\"hibernate.connection.driver_class\",driverClassName);
            configuration.setProperty(\"hibernate.connection.url\",url);
            configuration.setProperty(\"hibernate.connection.username\",username);
            configuration.setProperty(\"hibernate.connection.password\",password);
        }

        configuration.setProperty(\"hibernate.dialect\",hibernateDialect);
        configuration.addAnnotatedClass(User.class);
        configuration.addAnnotatedClass(Role.class);
        logger.info(\"begin database schema creation =========================\");
        new SchemaUpdate(configuration).execute(true,true);
        logger.info(\"end database schema creation ===========================\");
    }
}
和hibernate.cfg.xml:
<hibernate-configuration>
<session-factory>
    <mapping class=\"info.ems.models.User\" />
    <mapping class=\"info.ems.models.Role\" />
</session-factory>
</hibernate-configuration>
如您在HibernateEMSDao.java中所看到的,我试图查找是否存在预期的数据库模式,否则将通过SchemaHelper.java创建数据库模式。但不幸的是,它不起作用。我正在例外:
13:26:04,225 INFO  [STDOUT] 2011-05-29 13:26:04,225 [ScannerThread] INFO [info.ems.datasource.DataSourceFactory] - Embedded HSQLDB mode detected,switching on spring single connection data source.
13:26:05,063 INFO  [STDOUT] 2011-05-29 13:26:05,063 [ScannerThread] WARN [org.hibernate.util.JDBCExceptionReporter] - SQL Error: -22,SQLState: S0002
13:26:05,063 [ScannerThread] ERROR [org.hibernate.util.JDBCExceptionReporter] - Table not found in statement [select user0_.USER_ID as USER1_0_,user0_.USERNAME as USERNAME0_,user0_.PASSWORD as PASSWORD0_,user0_.NAME as NAME0_,user0_.EMAIL as EMAIL0_,user0_.LOCKED as LOCKED0_ from USER user0_ where user0_.USER_ID=1]
13:26:05,064 INFO  [STDOUT] 2011-05-29 13:26:05,064 [ScannerThread] WARN [info.ems.hibernate.HibernateEMSDao] - expected database schema does not exist,will create. Error is: could not execute query; nested exception is org.hibernate.exception.SQLGrammarException: could not execute query
13:26:05,065 INFO  [STDOUT] 2011-05-29 13:26:05,065 [ScannerThread] INFO [info.ems.hibernate.SchemaHelper] - begin database schema creation =========================
13:26:05,072 INFO  [STDOUT] 2011-05-29 13:26:05,071 [ScannerThread] FATAL [org.hibernate.connection.DatasourceConnectionProvider] - Could not find datasource: 
java.lang.ClassCastException: org.jnp.interfaces.NamingContext cannot be cast to javax.sql.DataSource
我做错了什么,任何信息对我都非常有帮助。 谢谢并恭祝安康。     

解决方法

        我认为(我可能错了; D)该异常确切地说明了正在发生的事情。 您定义:
<bean id=\"dataSource\" class=\"info.ems.datasource.DataSourceFactory\">
这不是数据源,然后将其传递给:
<bean id=\"sessionFactory\" class=\"org.springframework.orm.hibernate3.LocalSessionFactoryBean\">
<property name=\"dataSource\" ref=\"dataSource\"/>
上课的地方。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-