2011-10-14 7 views
2

私のJava Web Appはデータベースからデータを読み込みますが、何かを書き込もうとするとJPAはOKと言いますが、データベースは変更されません。私は "マージ"メソッドを呼び出し、データはデータベースに保存されず、メモリ内にのみ保存されます。私はデータベースに直接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!それはうまくいきました...私は** 'transaction-type = "JTA" ** ** persistence.xml **を設定するのに慣れていますが、今回は**トランザクションタイプに変更する必要がありました= "RESOURCE_LOCAL" '**私はトランザクションを手動で制御しなければならないことを忘れてしまいました。再度、感謝します! –

+1

これを追加すると(entityManager.getTransaction()。begin())、(entityManager.getTransaction()。commit())、次の例外が発生します。 しかし、entityManager.flush 例外名:java.lang.IllegalStateException:共有EntityManagerでトランザクションを作成できません - 代わりにSpringトランザクションまたはEJB CMTを使用してください – Sriram

関連する問題