2011-10-14 26 views
2

我的Java Web App从数据库中读取数据,但是当我尝试写入内容时,JPA说没关系,但数据库没有更改。我称之为“合并”方法,数据不会保存在数据库中,只能保存在内存中。我可以直接进入SELECT数据库并查看旧数据。但是,Java控制台不会抛出任何异常,如上所见。JPA读取但不会持续

Java控制台:

INFO: [EL Finest]: 2011-10-14 15:02:41.847--UnitOfWork(13027895)--Thread(Thread[http-thread-pool-8080-(6),10,Grizzly])--Merge clone with references user1 

更改密码的方法,该方法被调用:

public static User changePassword(String username, String oldPassword, String newPassword){ 
     User user = userFacade.find(username); 
     if(user != null && user.getPassword().equals(oldPassword)){ 
      user.setPassword(newPassword); 
      userFacade.edit(user); // supposed to save the new password on database, but it's not 
      // at this point, the user has a new password on memory, but on database the password is still the old one 
      return user; 
     } 
     return null; 
    } 

的persistence.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.0" 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"> 
    <persistence-unit name="APP1PU" transaction-type="RESOURCE_LOCAL"> 
     <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
     <class>com.company.User</class> 
     <properties> 
      <property name="javax.persistence.jdbc.url" value="jdbc:mysql://127.0.0.1:3306/app1"/> 
      <property name="javax.persistence.jdbc.password" value="12345"/> 
      <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/> 
      <property name="javax.persistence.jdbc.user" value="root"/> 
      <property name="eclipselink.logging.level" value="FINEST"/> 
     </properties> 
    </persistence-unit> 
</persistence> 

User.java:

@Entity 
@Table(name = "user") 
@Cache (
    type=CacheType.NONE 
    ) 
public class User implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Id 
    @Basic(optional = false) 
    private String username; 

    @Basic(optional = false) 
    private String password; 

    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; 
    } 
} 

UserFacade.java

public class UserFacade { 
    private EntityManagerFactory emf = Persistence.createEntityManagerFactory("APP1PU"); 

    private EntityManager em; 

    protected EntityManager getEntityManager() { 
     if(em == null){ 
      em = emf.createEntityManager(); 
     } 
     return em; 
    } 

    public void create(User entity) { 
     getEntityManager().persist(entity); 
    } 

    public void edit(User entity) { 
     getEntityManager().merge(entity); 
    } 

    public void remove(User entity) { 
     getEntityManager().remove(getEntityManager().merge(entity)); 
    } 

    public User find(Object id) { 
     return getEntityManager().find(entityClass, id); 
    } 

} 

任何人都可以弄清楚为什么这种行为?或者有一些我可以做的测试建议?

在此先感谢!

回答

2

尝试写入操作后entityManager.flush()。或者在写入操作之前开始一个事务(entityManager.getTransaction().begin()),然后在最后关闭它(entityManager.getTransaction().commit()

+1

谢谢,Andrei!它的工作......我习惯于在**'persistence.xml'**设置**'transaction-type =“JTA”'**,但是这次我需要将它改为**'transaction-type =“RESOURCE_LOCAL”**,并忘记我必须手动控制交易。再次感谢! –

+1

添加此(entityManager.getTransaction()。begin())和(entityManager.getTransaction()。commit())会导致以下异常: 但entityManager.flush()起作用。 异常名称:java.lang.IllegalStateException:不允许在共享EntityManager上创建事务 - 使用Spring事务或EJB CMT代替 – Sriram