Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Hibernate4和Spring3中使用JPA2时,如何设置SessionFactory?_Java_Spring_Hibernate_Jpa - Fatal编程技术网

Java 在Hibernate4和Spring3中使用JPA2时,如何设置SessionFactory?

Java 在Hibernate4和Spring3中使用JPA2时,如何设置SessionFactory?,java,spring,hibernate,jpa,Java,Spring,Hibernate,Jpa,在控制器中,我调用.persist时代码没有持久化。我还包括了我的AppConfig供参考,以及我的gradle依赖项。这一切都在Tomcat7上 Persistence.xml <persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocatio

在控制器中,我调用.persist时代码没有持久化。我还包括了我的AppConfig供参考,以及我的gradle依赖项。这一切都在Tomcat7上

Persistence.xml

<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="main">
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <properties>
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/dirtylibs"/>
            <property name="javax.persistence.jdbc.user" value="root"/>
            <property name="javax.persistence.jdbc.password" value="password"/>
            <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect"/>
            <property name="hibernate.format_sql" value="true"/>
            <property name="hibernate.show_sql" value="true"/>
        </properties>
    </persistence-unit>
</persistence>
AppConfig

@Configuration
@EnableWebMvc
@ComponentScan(basePackageClasses = AppConfig.class)
@EnableTransactionManagement
public class AppConfig {


    @Bean
    public InternalResourceViewResolver viewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/view/");
        resolver.setSuffix(".jsp");
        return resolver;
    }

    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() throws ClassNotFoundException, IllegalAccessException, InstantiationException {
        Class.forName("com.mysql.jdbc.Driver").newInstance(); //This is some wierdness I needed to do because the mysql driver wasn't being picked up correctly
        LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
        return localContainerEntityManagerFactoryBean;
    }
}
我的控制器

@Controller
public class SampleController {

    @PersistenceContext
    EntityManager entityManager;
    @RequestMapping("home/test/{id}")
    @ResponseBody
    public List<Integer> getMessagesTest(@PathVariable Integer id) {
        Phrase phrase = new Phrase();
        entityManager.persist(phrase);
        return Arrays.asList(phrase.getId());
    }

}
好的,没问题。看来这项工作将由政府来完成。一旦我开始在AppConfig中配置HibernateTransactionManager,我意识到我还需要一个SessionFactory

我对创建SessionFactory的所有选项以及它与persistence.xml的关系感到非常困惑

<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="main">
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <properties>
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/dirtylibs"/>
            <property name="javax.persistence.jdbc.user" value="root"/>
            <property name="javax.persistence.jdbc.password" value="password"/>
            <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect"/>
            <property name="hibernate.format_sql" value="true"/>
            <property name="hibernate.show_sql" value="true"/>
        </properties>
    </persistence-unit>
</persistence>
我的主要问题是,鉴于当前的设置,我应该如何构造会话工厂

查看Spring文档,我似乎必须重复persistence.xml中的所有信息,这对我来说似乎是错误的

任何帮助都将不胜感激,包括对当前设置的批评。我真的希望坚持使用Java配置,并尽可能避免使用XML。我甚至想离开这里所描述的persistence-config.xml,但我想等到它开始工作后再尝试

博兹霍在上的帖子给了我所需要的信息,让我把它联系在一起。我还没有弄清楚是否需要persistence.xml,但现在我正在将实体记录到数据库中

我的新AppConfig现在看起来像这样

@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() throws ClassNotFoundException, IllegalAccessException, InstantiationException {
    Class.forName("com.mysql.jdbc.Driver").newInstance();
    LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
    HibernateJpaVendorAdapter hibernateJpaVendorAdapter = new HibernateJpaVendorAdapter();
    hibernateJpaVendorAdapter.setDatabasePlatform("org.hibernate.dialect.MySQL5InnoDBDialect");
    hibernateJpaVendorAdapter.setShowSql(true);
    localContainerEntityManagerFactoryBean.setJpaVendorAdapter(hibernateJpaVendorAdapter);
    return localContainerEntityManagerFactoryBean;
}

@Bean
BasicDataSource basicDataSource() {
    BasicDataSource basicDataSource = new BasicDataSource();

    basicDataSource.setDriverClassName("com.mysql.jdbc.Driver");
    basicDataSource.setUrl("jdbc:mysql://localhost:3306/dirtylibs");
    basicDataSource.setUsername("root");
    basicDataSource.setPassword("password");

    return basicDataSource;
}


@Bean
JpaTransactionManager jpaTransactionManager(LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean) {
    JpaTransactionManager jpaTransactionManager = new JpaTransactionManager();
    jpaTransactionManager.setEntityManagerFactory(localContainerEntityManagerFactoryBean.getObject());
    return jpaTransactionManager;
}
我不得不为来自Apache的BasicDataSource引入另一个依赖项。这是Gradle坐标

compile group: 'commons-dbcp', name: 'commons-dbcp', version: '1.4'
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() throws ClassNotFoundException, IllegalAccessException, InstantiationException {
    Class.forName("com.mysql.jdbc.Driver").newInstance();
    LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
    HibernateJpaVendorAdapter hibernateJpaVendorAdapter = new HibernateJpaVendorAdapter();
    hibernateJpaVendorAdapter.setDatabasePlatform("org.hibernate.dialect.MySQL5InnoDBDialect");
    hibernateJpaVendorAdapter.setShowSql(true);
    localContainerEntityManagerFactoryBean.setJpaVendorAdapter(hibernateJpaVendorAdapter);
    return localContainerEntityManagerFactoryBean;
}

@Bean
BasicDataSource basicDataSource() {
    BasicDataSource basicDataSource = new BasicDataSource();

    basicDataSource.setDriverClassName("com.mysql.jdbc.Driver");
    basicDataSource.setUrl("jdbc:mysql://localhost:3306/dirtylibs");
    basicDataSource.setUsername("root");
    basicDataSource.setPassword("password");

    return basicDataSource;
}


@Bean
JpaTransactionManager jpaTransactionManager(LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean) {
    JpaTransactionManager jpaTransactionManager = new JpaTransactionManager();
    jpaTransactionManager.setEntityManagerFactory(localContainerEntityManagerFactoryBean.getObject());
    return jpaTransactionManager;
}
compile group: 'commons-dbcp', name: 'commons-dbcp', version: '1.4'