实体管理器不会将数据持久化到数据库中。

30 浏览
0 Comments

实体管理器不会将数据持久化到数据库中。

通过实体管理器,我试图将实体持久化到数据库中,但我无法实现持久化。以下是我的配置。\n我有这样的实体:\n

@Entity
@Table(name = "User")
public class UserModel implements Serializable, ModelItem {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;
    @Column(nullable = false)
    private String username;
    @Column(nullable = false)
    private String password;
    @Column(nullable = false)
    private String name;
    private String surname;
    private String notes;
    private String cellphone;
    @Column(nullable = false)
    private String email;
    private Boolean enabled;
    //get and set methods
    .....
}

\n以及执行持久化操作的导入Bean:\n

@Repository
public class ImportServiceImpl implements ImportService {
    @PersistenceContext
    protected EntityManager entityManager;
    @Transactional
    public boolean importExample() {
        User u= new User();
        u.setUsername("username");
        u.setPassword("password");
        u.setName("name");
        u.setEmail("email");
        entityManager.persist(u);
    }
}

\nSpring的实体管理器和数据库连接的配置:\n




 

    
    
        
             
             
            
        
    


    
    
        ${db.url}
    
    
        ${db.username}
    
    
        ${db.password}
    


    
    

\n以及我的persistence.xml:\n



    
    org.hibernate.ejb.HibernatePersistence
        
            
            
            
            
            
        
    

\n所以当我运行示例时,没有出现任何错误,但实体没有被持久化。我还尝试在persist之后添加entityManager.flush(),但在这种情况下,我会收到如下错误:\n

javax.persistence.TransactionRequiredException: no transaction is in progress
    at org.hibernate.ejb.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:793)

\n所以我在考虑我的Transactional Bean是否与方法绑定得不好,但我无法理解原因。有人知道为什么吗?\n我还注意到在STS中为此事务生成了2个具有相同数据的Bean,这看起来很奇怪(我不知道这是否是STS的错误还是我的配置中存在问题导致创建了2个Bean):\n[图片链接](https://i.stack.imgur.com/fxx83.png)

0
0 Comments

出现问题的原因是事务管理器配置错误。解决方法是在application-config.xml文件中添加transactionManager bean,并设置entityManagerFactory属性为正确的值。

具体的解决方法如下:


    

如果还有其他问题,请提供更多信息,例如你使用的是RESOURCE_LOCAL还是JTA事务。

0
0 Comments

(Entity manager does not persist data in the DB)这个问题的出现的原因是没有正确指定持久化单元的名称。解决方法是在注解中指定持久化单元的名称为"application",或者在entityManagerFactory bean中添加属性"name",值为"application"。

以下是解决方法的代码示例:

@PersistenceContext(unitName = "application")
private EntityManager entityManager;

或者


    
    

通过以上方法,可以解决(Entity manager does not persist data in the DB)这个问题。

0
0 Comments

问题出现的原因是错误使用了javax.transaction.Transactional而不是org.springframework.transaction.annotation.Transactional。

javax.transaction.Transactional和org.springframework.transaction.annotation.Transactional的区别请参考此处的详细描述:javax.transaction.Transactional vs org.springframework.transaction.annotation.Transactional

解决方法是正确使用org.springframework.transaction.annotation.Transactional。

0