2010-12-22 15 views
32

http://www.vaannila.com/spring/spring-hibernate-integration-1.htmlHibernate crear tablas en la base de datos de forma automática

Al leer este tutorial, no han mencionado nada sobre la creación de tablas en la base de datos. ¿Hibernate lo maneja automáticamente creando tablas y campos una vez que los especifico?

Aquí está mi configuración de beans.

<?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:p="http://www.springframework.org/schema/p" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> 

    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/WEB-INF/jsp/" p:suffix=".jsp" /> 

    <bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
     <property name="driverClassName" value="com.mysql.jdbc.Driver"/> 
     <property name="url" value="jdbc:mysql://127.0.0.1:3306/spring"/> 
     <property name="username" value="monwwty"/> 
     <property name="password" value="www"/> 
    </bean> 

    <bean id="mySessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
     <property name="dataSource" ref="myDataSource" /> 
     <property name="annotatedClasses"> 
      <list> 
       <value>uk.co.vinoth.spring.domain.User</value> 
      </list> 
     </property> 
     <property name="hibernateProperties"> 
      <props> 
       <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
       <prop key="hibernate.show_sql">true</prop> 
       <prop key="hibernate.hbm2ddl.auto">create</prop> 
      </props> 
     </property> 
    </bean> 

    <bean id="myUserDAO" class="uk.co.vinoth.spring.dao.UserDAOImpl"> 
     <property name="sessionFactory" ref="mySessionFactory"/> 
    </bean> 

    <bean name="/user/*.htm" class="uk.co.vinoth.spring.web.UserController" > 
     <property name="userDAO" ref="myUserDAO" /> 
    </bean> 

</beans> 

Respuesta

49

su entorno hibernate.hbm2ddl.auto debe ser la definición que se crea la base de datos (las opciones son validate, create, update o create-drop)

+1

esta configuración se encuentra en el archivo de configuración de hibernación. –

23

Sí lo hace en su caso debido a la siguiente propiedad en su configuración. Esto está bien durante la prueba, pero en producción debe deshabilitarlo.

<prop key="hibernate.hbm2ddl.auto">create</prop> 
+0

¿Podría explicar por qué es aconsejable desactivar esto durante la producción? –

+1

"El conjunto de conexiones de Hibernate incorporado no está destinado en modo alguno a la producción. Carece de varias funciones que se encuentran en las agrupaciones de conexiones listas para producción."http://docs.jboss.org/hibernate/orm/4.2/quickstart/en-US/html/ch02.html –

5

Sí, Hibernate puede ser configurado a través de la propiedad en hibernate.hbm2ddl.auto el archivo hibernate.cfg.xml para crear automáticamente tablas en su base de datos con el fin de almacenar sus entidades en ellas si la tabla aún no existe.

Esto puede ser útil durante el desarrollo, donde se puede utilizar un nuevo DB in-memory, y crear uno nuevo en cada ejecución de la aplicación o durante la prueba.

5

Para mí no funcionaba incluso con hibernate.hbm2ddl.auto establecido en update. Resultó que el SQL de creación generado no era válido, porque uno de mis nombres de columna (user) era una palabra clave SQL. Esto falló suavemente, y no era obvio lo que estaba pasando hasta que inspeccioné los registros.

-1

sí se puede utilizar

<property name="hbm2ddl.auto" value="create"/> 
5

complemento siguiente propiedad en el archivo de hibernate.cfg.xml

<property name="hibernate.hbm2ddl.auto">update</property>

Por cierto, en la clase de entidad, debe definir su @Id presentó como esto:

@Id 
@GeneratedValue(generator = "increment") 
@GenericGenerator(name = "increment", strategy = "increment") 
@Column(name = "id") 
private long id; 

si utiliza la siguiente definición, es m al vez no funcione:

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
@Column(name = "id") 
private long id; 
0

Hibernate puede crear una tabla, hibernación y la secuencia de tablas utilizado para el mapeo de muchos a muchos en su nombre, sino que tiene que configurar explícitamente llamando setProperty ("hibernate.hbm2ddl.auto" , "crear") del objeto Configuración. De manera predeterminada, solo valida el esquema con DB y falla si algo no existe ya dando el error "ORA-00942: tabla o vista no existe".

Si realiza la configuración anterior, el orden de las acciones realizadas será: - a) Suelte todas las tablas y secuencia y no proporcione un error si no están ya presentes. b) crear toda la tabla y secuencia c) alterar tablas con restricciones d) insertar datos en ella.

Cuestiones relacionadas