2010-12-22 4 views
32

http://www.vaannila.com/spring/spring-hibernate-integration-1.htmlHibernate créer des tables dans la base de données automatiquement

À la lecture de ce tutoriel, ils n'ont pas mentionné quoi que ce soit sur la création de tableaux dans la base de données. Est-ce que le Hibernate le gère automatiquement en créant des tables et des champs une fois que je les ai spécifiés.

Voici ma configuration de haricots.

<?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> 

Répondre

49

votre réglage hibernate.hbm2ddl.auto doit être définir que la base de données est créée (les options sont validate, create, update ou create-drop)

+1

ce paramètre se trouve dans le fichier de configuration hibernate. –

23

Oui dans votre cas à cause de la propriété ci-dessous dans votre configuration. C'est correct pendant le test, mais en production, vous devez le désactiver.

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

Pourriez-vous expliquer pourquoi il est conseillé de désactiver cette fonction pendant la production? –

+1

"Le pool de connexions Hibernate intégré n'est en aucun cas destiné à une utilisation en production, car il manque plusieurs fonctionnalités sur les pools de connexion prêts pour la production."http://docs.jboss.org/hibernate/orm/4.2/quickstart/en-US/html/ch02.html –

5

Oui, Hibernate peut être configuré par le biais de la propriété hibernate.hbm2ddl.auto en le fichier hibernate.cfg.xml pour créer automatiquement des tables dans votre base de données afin de stocker vos entités dans celles-ci si la table n'existe pas déjà. Ceci peut être utile pendant le développement où une nouvelle base de données in-memory, peut être utilisée et créée une nouvelle à chaque exécution de l'application ou pendant les tests.

5

Pour moi cela ne fonctionnait pas même avec hibernate.hbm2ddl.auto mis à update. Il s'est avéré que le code SQL de création généré n'était pas valide, car l'un de mes noms de colonne (user) était un mot clé SQL. Cela a échoué doucement, et ce n'était pas évident ce qui se passait jusqu'à ce que j'ai inspecté les journaux.

-1

oui vous pouvez utiliser

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

ajouter la propriété suivante dans votre fichier hibernate.cfg.xml

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

BTW, dans votre classe d'entité, vous devez définir votre @Id a déposé comme ce:

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

si vous utilisez la définition suivante, il m aybe ne fonctionne pas:

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

Mise en veille prolongée peut créer une table, mise en veille prolongée séquence et les tables utilisées pour beaucoup à plusieurs cartographie en votre nom, mais vous devez configurer explicitement en appelant setProperty (« hibernate.hbm2ddl.auto » , "créer") de l'objet Configuration. Par défaut, il valide simplement le schéma avec DB et échoue si quelque chose n'existe pas déjà en donnant l'erreur "ORA-00942: table ou vue n'existe pas". Si vous faites la configuration ci-dessus, alors l'ordre des actions effectuées sera: - a) Supprimez toutes les tables et séquences et ne donnez pas d'erreur si elles ne sont pas déjà présentes. b) créer toute la table et la séquence c) modifier les tables avec des contraintes d) insérer des données dans celle-ci.

Questions connexes