Mam następującą klasę encji (w 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
}
and my 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>
i scenariusz:
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()
baza danych Icarus istnieje, ale obecnie nie ma żadnych tabel. Chciałbym, aby Hibernate automatycznie tworzyło i / lub aktualizowało tabele na podstawie klas encji. Jak miałbym to osiągnąć?
Możesz spróbować zmienić ten wiersz w pliku persistence.xml z
do:
Ma to na celu utrzymanie schematu w celu śledzenia wszelkich zmian wprowadzonych w modelu za każdym razem, gdy uruchamiasz aplikację.
Mam to z JavaRanch
źródło
Czasami, w zależności od ustawienia konfiguracji, długa i krótka forma tagu właściwości również może mieć znaczenie.
np. jeśli masz to jak:
spróbuj zmienić to na:
źródło
W moim przypadku tabela nie została utworzona po raz pierwszy bez ostatniej właściwości wymienionej poniżej:
korzystał z bazy danych H2 w pamięci Wildfly
źródło
Jest jeden bardzo ważny szczegół, który może powstrzymać twoją hibernację przed generowaniem tabel (zakładając, że już ustawiłeś
hibernate.hbm2ddl.auto
). Będziesz także potrzebować@Table
adnotacji!W moim przypadku pomogło już co najmniej 3 razy - nadal nie mogę tego sobie przypomnieć;)
PS. Czytaj docs hibernacji - w większości przypadków będzie pewnie nie chcesz ustawić
hibernate.hbm2ddl.auto
, abycreate-drop
, ponieważ usuwa tabele po zatrzymaniu aplikacji.źródło
W pliku applicationContext.xml:
źródło
Aby wesprzeć odpowiedź @ thorinkor, rozszerzyłbym swoją odpowiedź, aby nie tylko używać adnotacji @Table (name = "table_name") dla encji, ale także każda zmienna potomna klasy encji powinna być opatrzona adnotacją @Column (name = "col_name"). Skutkuje to bezproblemową aktualizacją tabeli w ruchu.
Dla tych, którzy szukają konfiguracji hibernacji opartej na klasach Java, reguła ma zastosowanie również w konfiguracjach opartych na Javie (NewHibernateUtil). Mam nadzieję, że pomoże to komuś innemu.
źródło