JPA читает, но не сохраняется - PullRequest
2 голосов
/ 14 октября 2011

Мое Java Web App считывает данные из базы данных, но когда я пытаюсь что-то написать, JPA говорит, что все в порядке, но база данных не меняется.Я называю метод слияния, и данные не сохраняются в базе данных, а только в памяти.Я могу сделать SELECT прямо в базу данных и увидеть старые данные.Но консоль Java не выдает никаких исключений, как вы можете видеть выше.

Консоль 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);
    }

}

Кто-нибудь может понять, почему это поведение?Или у меня есть предложение сделать тест?

Заранее спасибо!

1 Ответ

2 голосов
/ 14 октября 2011

Попробуйте entityManager.flush() после операции записи. Или запустите транзакцию (entityManager.getTransaction().begin()) перед операцией записи, а затем закройте ее в конце (entityManager.getTransaction().commit())

...