使用带注释的类以编程方式(不带persistence.xml文件)创建EntityManagerFactory

amo*_*fis 8 hibernate entitymanager

现在我正在创建EntityManagerFactory这样的:

    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();
Run Code Online (Sandbox Code Playgroud)

但是正如我在javadocs中看到的那样,Ejb3Configuration不推荐使用它,我不应该使用它.我应该Persistence.createEntityManagerFactory()按照JPA规范 7.3节使用.但是后来我只能传递一些属性,但是我可以以某种方式添加带注释的类吗?

And*_*zyk 2

请找到带有 Spring 注解的 MySQL 的等效配置类:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

弹簧依赖:

 <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>
Run Code Online (Sandbox Code Playgroud)

要使用嵌入式数据库(例如 HSQL、H2 或 Derby)执行测试,您可以添加另一个数据源 bean:

@Bean(name = "embeddedDatabase")
public DataSource embeddedDataSource() {
    EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder();
    return builder.setType(EmbeddedDatabaseType.HSQL).build();
}
Run Code Online (Sandbox Code Playgroud)