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);
}
}
任何人都可以弄清楚爲什麼這種行爲?或者有一些我可以做的測試建議?
在此先感謝!
謝謝,Andrei!它的工作......我習慣於在**'persistence.xml'**設置**'transaction-type =「JTA」'**,但是這次我需要將它改爲**'transaction-type =「RESOURCE_LOCAL」**,並忘記我必須手動控制交易。再次感謝! –
添加此(entityManager.getTransaction()。begin())和(entityManager.getTransaction()。commit())會導致以下異常: 但entityManager.flush()起作用。 異常名稱:java.lang.IllegalStateException:不允許在共享EntityManager上創建事務 - 使用Spring事務或EJB CMT代替 – Sriram