【问题标题】:entityManager.persist not saving anything to databaseentityManager.persist 不将任何内容保存到数据库
【发布时间】:2016-05-05 14:20:12
【问题描述】:

我使用Spring 4.2.5 和org.hibernate 5.1.0。

当我使用entityManager.persist(user)保存user时,无法保存到数据库,也没有报错。

但如果我添加 entityManager.getTransaction().begin(); 和 entityManager.getTransaction().commit(); 就可以了。

代码如下

@Service
@Transactional
public class UserTestService {

    @PersistenceUnit
    private EntityManagerFactory entityManagerFactory;


    public void addUser(User user){
        EntityManager entityManager = entityManagerFactory.createEntityManager();
        //entityManager.getTransaction().begin();
        entityManager.persist(user);
        //entityManager.getTransaction().commit();
    }
}

还有我的配置

@Configuration
@EnableTransactionManagement
public class JPAConfig  {

    @Autowired
    private DataSource dataSource;

    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
        LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
        entityManagerFactoryBean.setDataSource(dataSource);
        entityManagerFactoryBean.setJpaVendorAdapter(jpaVendorAdapter() );
        entityManagerFactoryBean.setPackagesToScan("zhihu.model");
        return entityManagerFactoryBean;
    }


    @Bean
    public JpaVendorAdapter jpaVendorAdapter() {
        HibernateJpaVendorAdapter adapter = new HibernateJpaVendorAdapter();
        adapter.setDatabase(Database.MYSQL);
        adapter.setShowSql(true);
        adapter.setGenerateDdl(false);
        adapter.setDatabasePlatform("org.hibernate.dialect.MySQL5Dialect");
        return adapter;
    }



    @Bean
    public PlatformTransactionManager transactionManager(EntityManagerFactory emf){
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(emf);

        return transactionManager;
    }

    @Bean
    public PersistenceExceptionTranslationPostProcessor exceptionTranslation(){
        return new PersistenceExceptionTranslationPostProcessor();
    }
}

还有我的模特

@Entity
@Table(name = "user")
public class User implements Serializable {

    @Id
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    private long userID;

    @Column(name="username")
    private String username;

    @Column(name="password")
    private String password;

    public User(){

    }

    public User(long userID, String username, String password) {
        this.userID = userID;
        this.username = username;
        this.password = password;
    }

    public User(String username, String password) {
        this.username = username;
        this.password = password;
    }


    public long getUserID() {
        return userID;
    }

    public void setUserID(long userID) {
        this.userID = userID;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

pom.xml

<dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>4.2.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.2.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.38</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.7.3</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.7.3</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.7.3</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-web</artifactId>
            <version>4.0.4.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-config</artifactId>
            <version>4.0.4.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>

        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>5.1.0.Final</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-jpa</artifactId>
            <version>1.10.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>4.2.5.RELEASE</version>
        </dependency>

    </dependencies>

我认为问题是Transactional。但是下面的调试日志。

2016-05-05 21:33:10 DEBUG TransactionImpl:51 - begin
2016-05-05 21:33:10 DEBUG TransactionImpl:62 - committing

更新

如果我添加entityManager.flush();导致javax.persistence.TransactionRequiredException: no transaction is in progress.有什么问题?

【问题讨论】:

  • 没有TransactionRequiredException 吞到什么地方了吗?
  • 您必须开始交易。通过说 entityManager.getTransaction().begin()。要么使用 EntityTransaction 的提交方法,要么使用 entityManager.flush();不是都。当您说 commit() 事务将关闭并且您不能再次说 flush() 时。所以要明智地选择。

标签: java spring hibernate jpa jakarta-ee


【解决方案1】:

解决方案是注入EntityManager 而不是EntityManagerFactory

【讨论】:

    【解决方案2】:

    提交将使数据库提交。对持久对象的更改将写入数据库。

    当您拥有一个持久化对象并更改其上的值时,它会变脏,hibernate 需要将这些更改刷新到持久层。它可能会自动为您执行此操作,或者您可能需要手动执行此操作,这取决于您的冲洗模式(自动或手动):)

    最后你应该使用 commit :transaction.commit() 确实刷新了会话,但它也结束了工作单元。

    查看here了解更多信息。

    【讨论】:

    • 如果我添加entityManager.flush(); 导致javax.persistence.TransactionRequiredException: no transaction is in progress。有什么问题?
    • @TIMFUNNY 将@Transactional 添加到您的类或方法中
    【解决方案3】:

    如果你正在使用

    entityManager.persist(user);
    

    此语句执行后更改不会反映在数据库中。 实体自动管理将这些更改刷新到您的持久层。

    我们可以选择使用手动刷新它

    entityManager.flush(); 
    

    这应该可以解决你的问题

    【讨论】:

    • 如果我添加 entityManager.flush(); 导致 javax.persistence.TransactionRequiredException: no transaction is in progress.什么问题?
    • 实体可以通过两种方式进行管理,让容器自动管理或手动管理。在你的情况下 entityManager.getTransaction().begin();是手动处理的方式。如果你想让容器自动处理它,我们需要在 web.xml 中定义它
    【解决方案4】:

    从下面的方法中删除 EntityManagerFactory 参数。而是通过将其设置为 JpaTransactionManager 来注入您在上面设置的那个。下面的代码将为您工作。

    @Bean
    public PlatformTransactionManager transactionManager(){
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(**entityManagerFactory().getObject()**);
    
        return transactionManager;
    }
    

    【讨论】:

      猜你喜欢
      • 2013-12-31
      • 2011-07-19
      • 1970-01-01
      • 1970-01-01
      • 2011-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-16
      相关资源
      最近更新 更多