Hibernate3-maven-plugin – hbm2ddl

Hibernate3-maven-plugin – hbm2ddl

Wygenerowanie skryptu DDL (z ang. Data Definition Language) na podstawie definicji klas oznaczonych odpowiednio adnotacjami JPA to zadanie które można zrealizować w zasadzie na dwa podstawowe sposoby. Zaczniemy od konfiguracji pluginu hbm2ddl. Tworzymy nowy projekt Spring Boot – niezbędne zależności – plik pom.xml:

<dependencies>
 
	<dependency>
		<groupId>org.eclipse.persistence</groupId>
		<artifactId>javax.persistence</artifactId>
		<version>2.0.0</version>
	</dependency>
 
	<dependency>
		<groupId>org.hibernate</groupId>
		<artifactId>hibernate-entitymanager</artifactId>
		<version>4.3.0.Final</version>
	</dependency>
 
	<dependency>
		<groupId>com.h2database</groupId>
		<artifactId>h2</artifactId>
		<version>1.4.199</version>
	</dependency>
 
</dependencies>

Plugin hbm2ddl – generuje schemat DDL w katalogu ./schema. Uruchaminy jest w fazie process-classes czyli również podczas budowania paczki wynikowej:

<build>
    <plugins>
	<plugin>
		<groupId>org.codehaus.mojo</groupId>
		<artifactId>hibernate3-maven-plugin</artifactId>
		<version>2.2</version>
		<executions>
			<execution>
				<phase>process-classes</phase>
				<goals>
					<goal>hbm2ddl</goal>
				</goals>
			</execution>
		</executions>
		<configuration>
			<components>
				<component>
					<name>hbm2ddl</name>
                                        <implementation>
                                            jpaconfiguration
                                        </implementation>
					<outputDirectory>
					   /schema
					</outputDirectory>
				</component>
			</components>
			<componentProperties>
				<persistenceunit>userPU</persistenceunit>
				<outputfilename>db-schema.ddl</outputfilename>
				<drop>false</drop>
				<create>true</create>
				<export>false</export>
				<format>true</format>
			</componentProperties>
		</configuration>
	</plugin>
    </plugins>
</build>

Klasa modelu:

package model;
 
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
 
@Entity
@Table(name = "leader_user")
public class User {
 
    @Id
    @GeneratedValue
    Integer id;
 
    String name;
    String surname;
 
    public User() {
    }
 
   // setters & getters
 
}

Klasa demonstracyjna:

public class Start {
 
    private static EntityManager em;
 
    public static void main(String[] args) {
        EntityManagerFactory emf = 
                             Persistence.createEntityManagerFactory("userPU");
        em = emf.createEntityManager();
        createAndSaveSampleUsers(em);
        em.close();
    }
 
    public static void createAndSaveSampleUsers(EntityManager entityManager) {
 
        User james = new User("james", "spring");
        User alice = new User("alice", "li");
        User tom   = new User("tom", "guim");
 
        em.getTransaction().begin();
            entityManager.persist(james);
            entityManager.persist(alice);
            entityManager.persist(tom);
        em.getTransaction().commit();
 
    }
}

Plik persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
             http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
             version="2.0">
 
<persistence-unit name="userPU">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<properties>
  <property name="hibernate.connection.url"
            value="jdbc:h2:file:./Database;DB_CLOSE_ON_EXIT=FALSE;
                   AUTO_SERVER=TRUE" />
  <property name="hibernate.connection.driver_class" value = "org.h2.Driver"   />
  <property name="hibernate.connection.username"     value = "sa"              />
  <property name="hibernate.connection.password"     value = "password"        />
  <property name="hibernate.archive.autodetection"   value = "class"           />
  <property name="hibernate.show_sql"                value = "true"            />
  <property name="hibernate.format_sql"              value = "true"            />
  <property name="hibernate.hbm2ddl.auto"            value = "update"          />
  <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"   />
 
  <property name="javax.persistence.schema-generation.scripts.action" 
          value = "drop-and-create"   />
  <property name="javax.persistence.schema-generation.scripts.create-target" 
          value = "db-schema.jpa.ddl" />
  <property name="javax.persistence.schema-generation.scripts.drop-target" 
          value = "db-schema.jpa.ddl" />
 
</properties>
</persistence-unit>
</persistence>

Uruchomienie pluginu:

mvn hibernate3:hbm2ddl

Wynik:

[INFO] writing generated schema to file: C:\Users\mwarycha\Desktop\projects\JavaLeader.pl\hbm2ddl\schema\db-schema.ddl
 
    create table leader_user (
        id integer generated by default as identity,
        name varchar(255),
        surname varchar(255),
        primary key (id)
    );
[INFO] schema export complete

Innym sposobem na wygenerowanie schematu DDL jest użycie odpowiednich właściwości w pliku persistence.xml:

<property name  = "javax.persistence.schema-generation.scripts.action" 
	  value = "drop-and-create"   />
<property name  = "javax.persistence.schema-generation.scripts.create-target" 
	  value = "db-schema.jpa.ddl" />
<property name  = "javax.persistence.schema-generation.scripts.drop-target" 
	  value = "db-schema.jpa.ddl" />

Wtedy zależności w pliku pom.xml przedstawiają się następująco standard JPA 2.1 wspierany jest przez Hibernate od wersji 4.3http://hibernate.org/orm/releases/

<dependency>
	<groupId>org.hibernate</groupId>
	<artifactId>hibernate-entitymanager</artifactId>
	<version>4.3.0.Final</version>
</dependency>
 
<dependency>
	<groupId>org.hibernate</groupId>
	<artifactId>hibernate-core</artifactId>
	<version>4.3.0.Final</version>
</dependency>
 
<dependency>
	<groupId>com.h2database</groupId>
	<artifactId>h2</artifactId>
	<version>1.4.199</version>
</dependency>

Plik DDL który zostanie wygenerowany to db-schema.jpa:

create table leader_user (
    id integer generated by default as identity,  
    name varchar(255), 
    surname varchar(255), primary key (id)
)

Zobacz kod na GitHubie i zapisz się na bezpłatny newsletter!

.

 

Leave a comment

Your email address will not be published.


*