代码之家  ›  专栏  ›  技术社区  ›  rainman

如何使用Hibernate创建新的Oracle数据库

  •  1
  • rainman  · 技术社区  · 6 年前

    我是Hibernate的新手,我在JavaEE应用程序中遵循Hibernate教程,这里是我的Sturnist.xml文件:

    <persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
                 http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
                 version="2.1">
    
        <persistence-unit name="punit">
    
        </persistence-unit>
    </persistence>
    

    这里是我的休眠配置,文件名为 jpaContext.xml .

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx"
        xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
            http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">
    
        <bean id="entityManagerFactory"
            class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
            <property name="persistenceUnitName" value="punit" />
            <property name="dataSource" ref="dataSource" />
            <property name="jpaVendorAdapter">
                <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                    <property name="showSql" value="true" />
                </bean>
            </property>
    
            <property name="jpaPropertyMap">
                <map>
                    <entry key="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" />
                    <entry key="hibernate.hbm2ddl.auto" value="create" />
                    <entry key="hibernate.format_sql" value="true" />
                </map>
            </property>
        </bean>
    
        <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
            <property name="entityManagerFactory" ref="entityManagerFactory" />
        </bean>
        <tx:annotation-driven transaction-manager="transactionManager" />
        <bean id="dataSource"
            class="org.springframework.jdbc.datasource.DriverManagerDataSource">
            <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
            <property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl" />
            <property name="username" value="SYS AS SYSDBA" />
            <property name="password" value="password" />
        </bean>
    

    我的问题是,当我(第一次)启动服务器时,没有创建新的数据库,而是只为我的应用程序中的实体创建一个表,在sys模式中,如下图所示:

    enter image description here

    下面是创建表的实体:

    package com.pluralsight.model;
    
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Table;
    import javax.persistence.Id;
    
    import org.hibernate.validator.constraints.Range;
    
    @Entity
    @Table(name="goals")
    public class Goal {
    
        @Id 
        @GeneratedValue
        private Long Id;
    
        @Range(min = 1, max = 120)
        @Column(name="MINUTES")
        private int minutes;
    
        public int getMinutes() {
            return minutes;
        }
    
        public void setMinutes(int minutes) {
            this.minutes = minutes;
        }
    
        public Long getId() {
            return Id;
        }
    
        public void setId(Long id) {
            Id = id;
        }
    
    }
    

    虽然我正在寻找的是为我正在开发的应用程序创建新的数据库实例(如果它不存在的话),并提供给它(例如,与应用程序相同)。

    有人知道我怎么用Hibernate来实现这个吗?

    2 回复  |  直到 5 年前
        1
  •  1
  •   codemonkey    6 年前

    我要找的是创建新的数据库实例

    像mysql这样的调用数据库,Oracle调用模式。但是在MySQL中,数据库是独立的,与用户不同,而在Oracle中,模式几乎等同于用户。因此,在应用程序(或者至少是Hibernate会话工厂)启动之前,需要有效地创建用户/模式。不幸的是,OracleJDBC驱动程序不会为您这样做。

    create user foobar identified by somepass;
    

    然后给它适当的特权

    grant connect to foobar;
    grant create sequence to foobar;
    grant create session to foobar;
    grant create table to foobar;
    grant create trigger to foobar;
    grant unlimited tablespace to foobar;
    ...
    

    然后,应用程序可以作为该用户连接到数据库,Hibernate将能够在该用户的模式中创建表。

    或者,您也可以创建用户/模式,并继续以不同的用户(例如sys)身份连接,但在Hibernate中设置默认模式:

    <property name="hibernate.default_schema" value="foobar"/>
    

    这将确保在正确的模式中创建所有表。

        2
  •  1
  •   Avijit Barua    6 年前

    我可以建议你一件事,尽管我不知道它是否有效。添加属性

    <entry key="hibernate.default_schema" value="ABC" /> 
    

    和改变 <entry key="hibernate.hbm2ddl.auto" value="create" />

    <entry key="hibernate.hbm2ddl.auto" value="update" />.
    

    你可以查看这些链接!

    spring boot automatically create database schema Error

    https://developer.jboss.org/thread/106922]

    https://docs.jboss.org/jbossas/jboss4guide/r2/html/ch13.html