J'ai la classe d'entité suivante (dans Groovy):
import javax.persistence.Entity
import javax.persistence.Id
import javax.persistence.GeneratedValue
import javax.persistence.GenerationType
@Entity
public class ServerNode {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
Long id
String firstName
String lastName
}
et mon persistence.xml:
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0">
<persistence-unit name="NewPersistenceUnit">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<properties>
<property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/Icarus"/>
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
<property name="hibernate.connection.username" value="root"/>
<property name="hibernate.connection.password" value=""/>
<property name="hibernate.archive.autodetection" value="class"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
<property name="hbm2ddl.auto" value="create"/>
</properties>
<class>net.interaxia.icarus.data.models.ServerNode</class>
</persistence-unit>
</persistence>
et le script:
import javax.persistence.EntityManager
import javax.persistence.EntityManagerFactory
import javax.persistence.Persistence
import net.interaxia.icarus.data.models.ServerNode
def factory = Persistence.createEntityManagerFactory("NewPersistenceUnit")
def manager = factory.createEntityManager()
manager.getTransaction().begin()
manager.persist new ServerNode(firstName: "Test", lastName: "Server")
manager.getTransaction().commit()
la base de données Icarus existe, mais n'a actuellement aucune table. Je voudrais qu'Hibernate crée et / ou mette à jour automatiquement les tables basées sur les classes d'entités. Comment pourrais-je accomplir cela?
Vous pouvez essayer de changer cette ligne dans votre persistence.xml à partir de
à:
Ceci est censé maintenir le schéma pour suivre toutes les modifications que vous apportez au modèle chaque fois que vous exécutez l'application.
J'ai obtenu ceci de JavaRanch
la source
Parfois, selon la façon dont la configuration est définie, la forme longue et la forme courte de la balise de propriété peuvent également faire la différence.
par exemple si vous l'avez comme:
essayez de le changer en:
la source
Dans mon cas, la table n'a pas été créée pour la première fois sans la dernière propriété répertoriée ci-dessous:
a utilisé la base de données H2 en mémoire de Wildfly
la source
Il y a un détail très important, qui peut éventuellement empêcher votre mise en veille prolongée de générer des tables (en supposant que vous avez déjà défini le
hibernate.hbm2ddl.auto
). Vous aurez également besoin de l'@Table
annotation!Cela a déjà aidé dans mon cas au moins 3 fois - je ne m'en souviens toujours pas;)
PS. Lisez la documentation sur la mise en veille prolongée - dans la plupart des cas, vous ne voudrez probablement pas définir
hibernate.hbm2ddl.auto
surcreate-drop
, car cela supprime vos tables après l'arrêt de l'application.la source
Dans le fichier applicationContext.xml:
la source
Pour soutenir la réponse de @ thorinkor, j'étendrais ma réponse pour utiliser non seulement l'annotation @Table (name = "table_name") pour l'entité, mais aussi chaque variable enfant de la classe d'entité devrait être annotée avec @Column (name = "col_name"). Cela se traduit par une mise à jour transparente de la table lors de vos déplacements.
Pour ceux qui recherchent une configuration de mise en veille prolongée basée sur une classe Java, la règle s'applique également aux configurations basées sur Java (NewHibernateUtil). J'espère que cela aide quelqu'un d'autre.
la source