2008-11-20 37 views
85

Tôi có lớp sau thực thể (trong Groovy):Hibernate: Tự động tạo/cập nhật các bảng db dựa trên lớp thực thể

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 


} 

và persistence.xml tôi:

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

và kịch bản :

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() 

cơ sở dữ liệu 'Icarus' tồn tại nhưng hiện không có bảng. Tôi muốn Hibernate tự động tạo và/hoặc cập nhật các bảng dựa trên các lớp thực thể. Làm thế nào tôi sẽ thực hiện điều này?

Trả lời

87

Tôi không biết nếu rời hibernate ngoài khơi phía trước làm cho một sự khác biệt.

Các reference gợi ý nó nên hibernate.hbm2ddl.auto

Một giá trị của create sẽ tạo ra bảng tại tạo sessionfactory, và để lại cho họ còn nguyên vẹn.

Giá trị create-drop sẽ tạo bảng của bạn và sau đó thả chúng khi bạn đóng sessionFactory.

Có lẽ bạn nên đặt chú thích javax.persistence.Table một cách rõ ràng?

Hy vọng điều này sẽ hữu ích.

+9

Đó là thiếu 'ngủ đông' ở đầu hbm2dll.auto. cảm ơn! –

+0

Tôi vừa xóa dòng đó và nó sẽ không thả bảng. Hi vọng điêu nay co ich! – Meinkraft

+0

Làm thế nào tôi có thể tạo ngủ đông để tạo bảng nếu chúng không tồn tại? –

72

Bạn có thể thử thay đổi dòng này trong persistence.xml của bạn từ

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

tới:

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

Đây là vụ phải duy trì sơ đồ để làm theo bất kỳ thay đổi bạn thực hiện cho Model mỗi lần bạn chạy ứng dụng.

Got này từ JavaRanch

8

Đôi khi tùy thuộc vào cách cấu hình được đặt, biểu mẫu dài và dạng ngắn của thẻ thuộc tính cũng có thể tạo sự khác biệt.

ví dụ: nếu bạn có nó thích:

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

thử thay đổi nó để:

<property name="hibernate.hbm2ddl.auto">create</property> 
-3

Hibernate hbm2ddl.auto:

Tự động xác nhận hoặc xuất khẩu schema DDL để cơ sở dữ liệu khi SessionFactory được tạo ra . Với việc tạo-thả, lược đồ cơ sở dữ liệu sẽ bị loại bỏ khi SessionFactory được đóng một cách rõ ràng. ví dụ: xác thực | cập nhật | tạo | create-drop

Vui lòng kiểm tra link để biết thêm chi tiết.

+1

liên kết này đã lỗi thời/hỏng –

0

Có một chi tiết rất quan trọng, hơn có thể có thể ngăn không cho ngủ đông của bạn tạo bảng (giả sử Bạn đã đặt hibernate.hbm2ddl.auto).Bạn cũng sẽ cần chú thích @Table!

@Entity 
@Table(name = "test_entity") 
    public class TestEntity { 
} 

Nó đã giúp trong trường hợp của tôi ít nhất 3 lần - vẫn không thể nhớ nó;)

PS. Đọc tài liệu ngủ đông - trong hầu hết các trường hợp Bạn có thể không muốn đặt hibernate.hbm2ddl.auto thành create-drop, vì nó xóa bảng của bạn sau khi dừng ứng dụng.

0

Trong file 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> 
0

Trong bảng trường hợp của tôi không được tạo ra lần đầu tiên mà không cần tài sản cuối cùng liệt kê dưới đây:

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

sử dụng cơ sở dữ liệu H2 trong bộ nhớ Wildfly của

Các vấn đề liên quan