J'ai la classe d'entité suivante (en 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. J'aimerais qu'Hibernate crée et/ou mette à jour automatiquement les tables en fonction des classes d'entité. Comment pourrais-je accomplir ceci?
Je ne sais pas si laisser hibernate
à l'avant fait une différence.
Le référence suggère que ce devrait être _hibernate.hbm2ddl.auto
_
Une valeur de create
créera vos tables lors de la création de sessionFactory et les laissera intactes.
Une valeur de _create-drop
_ créera vos tables, puis les supprimera à la fermeture de la sessionFactory.
Peut-être devriez-vous définir explicitement l'annotation javax.persistence.Table
?
J'espère que cela t'aides.
Vous pouvez essayer de changer cette ligne dans votre persistence.xml à partir de
<property name="hbm2ddl.auto" value="create"/>
à:
<property name="hibernate.hbm2ddl.auto" value="update"/>
Ceci est supposé maintenir le schéma pour suivre toutes les modifications que vous apportez au modèle chaque fois que vous exécutez l'application.
Je l'ai obtenu de JavaRanch
Parfois, en fonction de la configuration de la configuration, 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:
<property name="hibernate.hbm2ddl.auto" value="create"/>
essayez de le changer pour:
<property name="hibernate.hbm2ddl.auto">create</property>
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:
<properties>
<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-drop"/>
<!-- without below table was not created -->
<property name="javax.persistence.schema-generation.database.action" value="drop-and-create" />
</properties>
utilisé la base de données H2 en mémoire de Wildfly
Il y a un détail très important qui peut empêcher votre hibernation 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'annotation @Table
!
@Entity
@Table(name = "test_entity")
public class TestEntity {
}
Cela a déjà aidé dans mon cas au moins 3 fois - je ne m'en souviens toujours pas;)
PS Lisez les documents d'hibernation - dans la plupart des cas, vous ne voudrez probablement pas définir hibernate.hbm2ddl.auto
sur create-drop
, car il supprime vos tables après avoir arrêté l'application.
Dans le fichier applicationContext.xml:
<bean id="entityManagerFactoryBean" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource" />
<!-- This makes /META-INF/persistence.xml is no longer necessary -->
<property name="packagesToScan" value="com.howtodoinjava.demo.model" />
<!-- JpaVendorAdapter implementation for Hibernate EntityManager.
Exposes Hibernate's persistence provider and EntityManager extension interface -->
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
</property>
<property name="jpaProperties">
<props>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
</props>
</property>
</bean>