我在内存中有Hsqldb 1)
<jdbc:embedded-database id="idtSimulatorDataSource" type="HSQL">
<jdbc:script location="classpath:hsql/idt_schema.sql"/>
</jdbc:embedded-database>
2)在服务器模式下
<bean id="idtSimulatorDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="org.hsqldb.jdbc.JDBCDriver"/>
<property name="username" value="sa"/>
<property name="password" value=""/>
<property name="url" value="jdbc:hsqldb:hsql://localhost:9001/idt_simulatordb"/>
</bean>
1)一切正常2)无法创建架构 . 如果我手动创建模式,那么hibernate创建所有必要的DDL操作,并且everethyng也能正常工作 . 但我不知道我应该在哪里为db初始化脚本分配属性
这是我的持久性文件
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
<persistence-unit name="IDTSimulator" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<class>com.nxsystems.simulator.idt.domain.IDTAccount</class>
<class>com.nxsystems.simulator.idt.domain.IDTCard</class>
<class>com.nxsystems.simulator.idt.domain.IDTCurrency</class>
<class>com.nxsystems.simulator.idt.domain.IDTCardHolder</class>
<class>com.nxsystems.simulator.idt.domain.IDTProgram</class>
<class>com.nxsystems.simulator.idt.domain.IDTTransaction</class>
<exclude-unlisted-classes>true</exclude-unlisted-classes>
<properties>
<!-- -->
<property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
<property name="hibernate.default_schema" value="simulators"/>
<!-- -->
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
<!-- -->
<property name="hibernate.cache.use_second_level_cache" value="true"/>
<property name="hibernate.cache.use_query_cache" value="false"/>
<property name="hibernate.cache.region.factory_class" value="net.sf.ehcache.hibernate.EhCacheRegionFactory"/>
<!-- -->
<!--<property name="hibernate.hbm2ddl.auto" value="create"/>-->
<property name="hibernate.hbm2ddl.auto" value="create-drop"/>
<property name="hibernate.connection.pool_size" value="10"/>
</properties>
</persistence-unit>
</persistence>
这是我的init文件脚本
DROP SCHEMA IF EXISTS simulators CASCADE;
CREATE SCHEMA SIMULATORS AUTHORIZATION SA -- not work yet
CREATE TABLE SIMULATORS.dirtyhack();
也许最好自动创建架构,但我不知道如何
UPDATE 我已经开始介绍如何启动db init脚本:
jdbc:initialize-database data-source =“idtSimulatorDataSource”>
我也定了
<property name="hibernate.hbm2ddl.auto" value="create"/>
但现在我有以下错误:
11:15:57,337 WARN (main) [JDBCExceptionReporter] SQL Error: -5501, SQLState: 42501
11:15:57,370 ERROR (main) [JDBCExceptionReporter] user lacks privilege or object not found: IDT_CARD
http://publib.boulder.ibm.com/iseries/v5r1/ic2924/index.htm?info/rzala/rzalastc.html
SQLSTATE Value: 42501
Meaning: The authorization ID does not have the privilege to perform the specified operation on the identified object.
什么是特权?????
UPDATE: 现在我真的很困惑 . 我看着日志 . 请参阅以下内容:
/ C2 / SET SCHEMA PUBLIC DROP SCHEMA IF EXISTS模拟器CASCADE CREATE SCHEMA模拟器授权SA创建表模拟器.dhack()断开连接/ C3 / SET模式公共断开/ C4 / SET模式公共丢弃模式如果存在模拟器CASCADE CREATE SCHEMA SIMULATORS AUTHORIZATION SA DISCONNECT / C5 / SET SCHEMA PUBLIC DISCONNECT / C6 / SET SCHEMA PUBLIC
但我最近更改了我的init脚本:
DROP SCHEMA IF EXISTS simulators CASCADE;
CREATE SCHEMA SIMULATORS AUTHORIZATION sa -- not work yet
CREATE TABLE SIMULATORS.dirtyhack1();
我的 dirtyhack1 ()表在哪里???我删除了有关之前发布的所有提及
UPDATE
我找到了原因 . 在Hibernate创建其DDL操作之后执行此块:
<jdbc:embedded-database id="idtSimulatorDataSource" type="HSQL">
<jdbc:script location="classpath:hsql/idt_schema.sql"/>
</jdbc:embedded-database>
我的代码包含这样的行:
public static Server server = new Server();
@AfterClass
public static void tearDown1() throws Exception {
server.shutdown();
}
@BeforeClass
public static void setUp() throws Exception {
HsqlProperties p = new HsqlProperties();
p.setProperty("server.database.0", "file:./idt_simulatordb");
p.setProperty("server.dbname.0", "idt_simulatordb");
p.setProperty("server.port", "9001");
server.setProperties(p);
server.start();
Connection conn = DriverManager.getConnection("jdbc:hsqldb:hsql://localhost:9001/idt_simulatordb", "sa", "");
conn.setAutoCommit(true);
Statement st = conn.createStatement(); // statements
String expression1 = "DROP SCHEMA IF EXISTS simulators CASCADE;\n";
(1)String expression2 = "CREATE SCHEMA SIMULATORS AUTHORIZATION SA;";
String expression3 = "CREATE TABLE SIMULATORS.dirtyhack1();";
st.executeUpdate(expression1); // run the query
st.executeUpdate(expression2); // run the query
st.executeUpdate(expression3); // run the query
st.close();
conn.close();
}
这就是为什么我没找到我的dirtyhack1表,这就是我收到错误的原因 . Init-database刚删除了我的模拟器架构
所以有一个问题 . 如何在Hibernate之前启动init脚本?因为如果我不写行(1)然后我得到错误的架构导出错误
1 回答
您可以使用Spring EmbeddedDatabaseBuilder来创建数据库 . 像这样的东西:
然后,您不需要Hibernate为您创建架构,因为它已经存在 .