2013-12-16 14 views
8

Teraz tworzę EntityManagerFactory takiego:Tworzenie EntityManagerFactory programowo (bez persistence.xml pliku) z adnotacjami klas

Map<String, String> properties = ImmutableMap.<String, String>builder() 
     .put(DRIVER, "com.mysql.jdbc.Driver") 
     .put(DIALECT, "org.hibernate.dialect.MySQL5Dialect"); 
     .put(USER, dbUsername) 
     .put(PASS, dbPassword) 
     .put(URL, dbConnectionUrl) 
     //Some more properties 
     .build(); 

    Ejb3Configuration cfg = new Ejb3Configuration(); 

    cfg.configure(properties); 

    cfg.addAnnotatedClass(AuditEntry.class); 
    cfg.addAnnotatedClass(LastWrittenEventId.class); 
    //Some more annotated classes 

    return cfg.createEntityManagerFactory(); 

Jednak jak widzę w Javadocs, Ejb3Configuration jest przestarzała i nie należy go używać. Powinienem użyć Persistence.createEntityManagerFactory() zgodnie z JPA spec rozdział 7.3. Ale mogę przekazać tylko niektóre właściwości, ale czy mogę w jakiś sposób dodać przypisane klasy?

+0

Myślę, że ten post może Ci pomóc http://stackoverflow.com/questions/8448950/adding-entity-classes-dynamicznie-at-runtime –

Odpowiedz

1

Proszę znaleźć odpowiednik klasy konfiguracji MySQL z adnotacji wiosny:

package config; 

import java.util.Properties; 

import javax.persistence.EntityManagerFactory; 
import javax.sql.DataSource; 

import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.jdbc.datasource.DriverManagerDataSource; 
import org.springframework.orm.jpa.JpaTransactionManager; 
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; 
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; 
import org.springframework.transaction.PlatformTransactionManager; 
import org.springframework.transaction.annotation.EnableTransactionManagement; 

@Configuration 
@EnableTransactionManagement 
public class DatabaseConfiguration { 

    private Properties jpaProperties() { 
     Properties properties = new Properties(); 
     properties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect"); 
     return properties; 
    } 

    @Bean 
    public DataSource dataSource() { 

     DriverManagerDataSource dataSource = new DriverManagerDataSource(); 
     dataSource.setDriverClassName("com.mysql.jdbc.Driver"); 
     dataSource.setUrl("jdbc:mysql://localhost:3306/test"); 
     dataSource.setUsername("username"); 
     dataSource.setPassword("password"); 

     return dataSource; 
    } 

    @Bean 
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() { 

     HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); 

     LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean(); 
     factory.setJpaVendorAdapter(vendorAdapter); 
     factory.setPackagesToScan("foo.bar"); 
     factory.setDataSource(dataSource()); 
     factory.setJpaProperties(jpaProperties()); 

     return factory; 
    } 

    @Bean 
    public PlatformTransactionManager transactionManager(EntityManagerFactory emf) { 

     JpaTransactionManager txManager = new JpaTransactionManager(); 
     txManager.setEntityManagerFactory(emf); 

     return txManager; 
    } 
} 

Wiosna zależności:

<dependencies> 
    ... 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-context</artifactId> 
     <version>4.2.1.RELEASE</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-tx</artifactId> 
     <version>4.2.1.RELEASE</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-jdbc</artifactId> 
     <version>4.2.1.RELEASE</version> 
    </dependency> 
     <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-orm</artifactId> 
     <version>4.2.1.RELEASE</version> 
    </dependency> 
    ... 
</dependencies> 

przeprowadzić testy z wbudowaną bazą danych, takich jak HSQL, H2 lub Derby, możesz dodać kolejny komponent źródła danych:

@Bean(name = "embeddedDatabase") 
public DataSource embeddedDataSource() { 
    EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder(); 
    return builder.setType(EmbeddedDatabaseType.HSQL).build(); 
} 
Powiązane problemy