Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java.lang.IllegalStateException:事务已处于活动状态,事务未处于活动状态_Java_Mysql_Jpa_Javafx_Transactions - Fatal编程技术网

java.lang.IllegalStateException:事务已处于活动状态,事务未处于活动状态

java.lang.IllegalStateException:事务已处于活动状态,事务未处于活动状态,java,mysql,jpa,javafx,transactions,Java,Mysql,Jpa,Javafx,Transactions,我有一个JavaFX应用程序,它通过JPA技术访问MySQL数据库 以下是我在应用程序中创建和使用实体管理器的方法: import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; public class EntityManagerHelper { private static final Enti

我有一个JavaFX应用程序,它通过JPA技术访问MySQL数据库

以下是我在应用程序中创建和使用实体管理器的方法:

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

public class EntityManagerHelper {

    private static final EntityManagerFactory emf;
    private static final ThreadLocal<EntityManager> threadLocal;

    static {
        if (InitPersistence.persistenceMap != null && InitPersistence.getNewIP() != null)
            emf = Persistence.createEntityManagerFactory("TonalityJPA",
                    InitPersistence.persistenceMap);
        else
            emf = Persistence.createEntityManagerFactory("TonalityJPA");
        threadLocal = new ThreadLocal<EntityManager>();
    }

    public static EntityManager getEntityManager() {
        EntityManager em = threadLocal.get();

        if (em == null) {
            em = emf.createEntityManager();
            // set your flush mode here
            threadLocal.set(em);
        }
        return em;
    }

    public static void closeEntityManager() {
        EntityManager em = threadLocal.get();
        if (em != null) {
            em.close();
            threadLocal.set(null);
        }
    }

    public static void closeEntityManagerFactory() {
        emf.close();
    }


    public static void begin() {
        getEntityManager().getTransaction().begin();
    }

    public static <T> void remove(T thingToRemove) {
        getEntityManager().remove(thingToRemove);
    }

    public static <T> void persist(T thingToPersist) {
        getEntityManager().persist(thingToPersist);
    }

    public static void rollback() {
        getEntityManager().getTransaction().rollback();
    }

    public static void commit() {
        getEntityManager().getTransaction().commit();

    }

    public static <T> T find(Class<T> a, long id) {
        return getEntityManager().find(a, id);
    }
}
delBtn.setOnAction(event -> { 
                long id = currentUser.getUserId();
                new UserActions().delete(id);
                UserLogEntity userLog = new UserLogEntity(UserData.getUser().getUserId(), "deleted user: " +
                        currentUser.getUserLogin(), 3, new Date());
                UserLogActions log_action = new UserLogActions();
                log_action.add(userLog);
            } else {
                Alert alert = new Alert(Alert.AlertType.INFORMATION);
                alert.setTitle("Помилка");
                alert.setHeaderText("");
                alert.setContentText("Оберіть користувача для видалення");

                alert.showAndWait();
            }

        });
package com.Model.DataBase.Entities;

import org.mindrot.jbcrypt.BCrypt;

import javax.persistence.*;

/**
 * Created by User on 07.03.2016.
 */
@Entity
@Table(name = "user", schema = "newsmonitoringdb")
public class UserEntity {
    private Long userId;
    private String userLogin;
    private String userPass;
    private int userAccessLvl;

    public UserEntity(){}

    public UserEntity(String login, String pass, int accessLvl)
    {
        this.userLogin = login;
        this.userPass = pass;
        this.userAccessLvl = accessLvl;
    }    

    @Id
    @Column(name = "userID")
    public Long getUserId() {
        return userId;
    }

    public void setUserId(Long userId) {
        this.userId = userId;
    }

    @Basic
    @Column(name = "userLogin")
    public String getUserLogin() {
        return userLogin;
    }

    public void setUserLogin(String userLogin) {
        this.userLogin = userLogin;
    }

    @Basic
    @Column(name = "userPass")
    public String getUserPass() {
        return userPass;
    }

    public void setUserPass(String userPass) {
        this.userPass = userPass;
    }

    @Basic
    @Column(name = "userAccessLvl")
    public int getUserAccessLvl() {
        return userAccessLvl;
    }
}
package com.Model.DataBase.EntitiesActions;

import com.Model.DataBase.Entities.UserEntity;
import com.Model.DataBase.EntityManagerHelper;

import javax.persistence.EntityManager;
import javax.persistence.Query;
import java.util.List;

public class UserActions{

    public List<UserEntity> list() {
        Query query = EntityManagerHelper.getEntityManager().createQuery("SELECT a FROM UserEntity a", UserEntity.class);
        return  (List <UserEntity>) query.getResultList();

    }

    public void add(UserEntity user) {
        try {
            EntityManagerHelper.begin();
            EntityManagerHelper.persist(user);
            EntityManagerHelper.commit();

        } catch (Exception ex) {
            //entityManager.getTransaction().rollback();
            //ex.printStackTrace();
        }
    }

    public void delete(long id) {
        try {
            UserEntity user = EntityManagerHelper.find(UserEntity.class, id);
            EntityManagerHelper.begin();
            EntityManagerHelper.remove(user);
            EntityManagerHelper.commit();
        } catch (Exception ex) {
            ex.printStackTrace();
            EntityManagerHelper.rollback();
        }
    }
}
下面是UserEntity和UserActions类:

用户实体:

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

public class EntityManagerHelper {

    private static final EntityManagerFactory emf;
    private static final ThreadLocal<EntityManager> threadLocal;

    static {
        if (InitPersistence.persistenceMap != null && InitPersistence.getNewIP() != null)
            emf = Persistence.createEntityManagerFactory("TonalityJPA",
                    InitPersistence.persistenceMap);
        else
            emf = Persistence.createEntityManagerFactory("TonalityJPA");
        threadLocal = new ThreadLocal<EntityManager>();
    }

    public static EntityManager getEntityManager() {
        EntityManager em = threadLocal.get();

        if (em == null) {
            em = emf.createEntityManager();
            // set your flush mode here
            threadLocal.set(em);
        }
        return em;
    }

    public static void closeEntityManager() {
        EntityManager em = threadLocal.get();
        if (em != null) {
            em.close();
            threadLocal.set(null);
        }
    }

    public static void closeEntityManagerFactory() {
        emf.close();
    }


    public static void begin() {
        getEntityManager().getTransaction().begin();
    }

    public static <T> void remove(T thingToRemove) {
        getEntityManager().remove(thingToRemove);
    }

    public static <T> void persist(T thingToPersist) {
        getEntityManager().persist(thingToPersist);
    }

    public static void rollback() {
        getEntityManager().getTransaction().rollback();
    }

    public static void commit() {
        getEntityManager().getTransaction().commit();

    }

    public static <T> T find(Class<T> a, long id) {
        return getEntityManager().find(a, id);
    }
}
delBtn.setOnAction(event -> { 
                long id = currentUser.getUserId();
                new UserActions().delete(id);
                UserLogEntity userLog = new UserLogEntity(UserData.getUser().getUserId(), "deleted user: " +
                        currentUser.getUserLogin(), 3, new Date());
                UserLogActions log_action = new UserLogActions();
                log_action.add(userLog);
            } else {
                Alert alert = new Alert(Alert.AlertType.INFORMATION);
                alert.setTitle("Помилка");
                alert.setHeaderText("");
                alert.setContentText("Оберіть користувача для видалення");

                alert.showAndWait();
            }

        });
package com.Model.DataBase.Entities;

import org.mindrot.jbcrypt.BCrypt;

import javax.persistence.*;

/**
 * Created by User on 07.03.2016.
 */
@Entity
@Table(name = "user", schema = "newsmonitoringdb")
public class UserEntity {
    private Long userId;
    private String userLogin;
    private String userPass;
    private int userAccessLvl;

    public UserEntity(){}

    public UserEntity(String login, String pass, int accessLvl)
    {
        this.userLogin = login;
        this.userPass = pass;
        this.userAccessLvl = accessLvl;
    }    

    @Id
    @Column(name = "userID")
    public Long getUserId() {
        return userId;
    }

    public void setUserId(Long userId) {
        this.userId = userId;
    }

    @Basic
    @Column(name = "userLogin")
    public String getUserLogin() {
        return userLogin;
    }

    public void setUserLogin(String userLogin) {
        this.userLogin = userLogin;
    }

    @Basic
    @Column(name = "userPass")
    public String getUserPass() {
        return userPass;
    }

    public void setUserPass(String userPass) {
        this.userPass = userPass;
    }

    @Basic
    @Column(name = "userAccessLvl")
    public int getUserAccessLvl() {
        return userAccessLvl;
    }
}
package com.Model.DataBase.EntitiesActions;

import com.Model.DataBase.Entities.UserEntity;
import com.Model.DataBase.EntityManagerHelper;

import javax.persistence.EntityManager;
import javax.persistence.Query;
import java.util.List;

public class UserActions{

    public List<UserEntity> list() {
        Query query = EntityManagerHelper.getEntityManager().createQuery("SELECT a FROM UserEntity a", UserEntity.class);
        return  (List <UserEntity>) query.getResultList();

    }

    public void add(UserEntity user) {
        try {
            EntityManagerHelper.begin();
            EntityManagerHelper.persist(user);
            EntityManagerHelper.commit();

        } catch (Exception ex) {
            //entityManager.getTransaction().rollback();
            //ex.printStackTrace();
        }
    }

    public void delete(long id) {
        try {
            UserEntity user = EntityManagerHelper.find(UserEntity.class, id);
            EntityManagerHelper.begin();
            EntityManagerHelper.remove(user);
            EntityManagerHelper.commit();
        } catch (Exception ex) {
            ex.printStackTrace();
            EntityManagerHelper.rollback();
        }
    }
}
用户操作:

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

public class EntityManagerHelper {

    private static final EntityManagerFactory emf;
    private static final ThreadLocal<EntityManager> threadLocal;

    static {
        if (InitPersistence.persistenceMap != null && InitPersistence.getNewIP() != null)
            emf = Persistence.createEntityManagerFactory("TonalityJPA",
                    InitPersistence.persistenceMap);
        else
            emf = Persistence.createEntityManagerFactory("TonalityJPA");
        threadLocal = new ThreadLocal<EntityManager>();
    }

    public static EntityManager getEntityManager() {
        EntityManager em = threadLocal.get();

        if (em == null) {
            em = emf.createEntityManager();
            // set your flush mode here
            threadLocal.set(em);
        }
        return em;
    }

    public static void closeEntityManager() {
        EntityManager em = threadLocal.get();
        if (em != null) {
            em.close();
            threadLocal.set(null);
        }
    }

    public static void closeEntityManagerFactory() {
        emf.close();
    }


    public static void begin() {
        getEntityManager().getTransaction().begin();
    }

    public static <T> void remove(T thingToRemove) {
        getEntityManager().remove(thingToRemove);
    }

    public static <T> void persist(T thingToPersist) {
        getEntityManager().persist(thingToPersist);
    }

    public static void rollback() {
        getEntityManager().getTransaction().rollback();
    }

    public static void commit() {
        getEntityManager().getTransaction().commit();

    }

    public static <T> T find(Class<T> a, long id) {
        return getEntityManager().find(a, id);
    }
}
delBtn.setOnAction(event -> { 
                long id = currentUser.getUserId();
                new UserActions().delete(id);
                UserLogEntity userLog = new UserLogEntity(UserData.getUser().getUserId(), "deleted user: " +
                        currentUser.getUserLogin(), 3, new Date());
                UserLogActions log_action = new UserLogActions();
                log_action.add(userLog);
            } else {
                Alert alert = new Alert(Alert.AlertType.INFORMATION);
                alert.setTitle("Помилка");
                alert.setHeaderText("");
                alert.setContentText("Оберіть користувача для видалення");

                alert.showAndWait();
            }

        });
package com.Model.DataBase.Entities;

import org.mindrot.jbcrypt.BCrypt;

import javax.persistence.*;

/**
 * Created by User on 07.03.2016.
 */
@Entity
@Table(name = "user", schema = "newsmonitoringdb")
public class UserEntity {
    private Long userId;
    private String userLogin;
    private String userPass;
    private int userAccessLvl;

    public UserEntity(){}

    public UserEntity(String login, String pass, int accessLvl)
    {
        this.userLogin = login;
        this.userPass = pass;
        this.userAccessLvl = accessLvl;
    }    

    @Id
    @Column(name = "userID")
    public Long getUserId() {
        return userId;
    }

    public void setUserId(Long userId) {
        this.userId = userId;
    }

    @Basic
    @Column(name = "userLogin")
    public String getUserLogin() {
        return userLogin;
    }

    public void setUserLogin(String userLogin) {
        this.userLogin = userLogin;
    }

    @Basic
    @Column(name = "userPass")
    public String getUserPass() {
        return userPass;
    }

    public void setUserPass(String userPass) {
        this.userPass = userPass;
    }

    @Basic
    @Column(name = "userAccessLvl")
    public int getUserAccessLvl() {
        return userAccessLvl;
    }
}
package com.Model.DataBase.EntitiesActions;

import com.Model.DataBase.Entities.UserEntity;
import com.Model.DataBase.EntityManagerHelper;

import javax.persistence.EntityManager;
import javax.persistence.Query;
import java.util.List;

public class UserActions{

    public List<UserEntity> list() {
        Query query = EntityManagerHelper.getEntityManager().createQuery("SELECT a FROM UserEntity a", UserEntity.class);
        return  (List <UserEntity>) query.getResultList();

    }

    public void add(UserEntity user) {
        try {
            EntityManagerHelper.begin();
            EntityManagerHelper.persist(user);
            EntityManagerHelper.commit();

        } catch (Exception ex) {
            //entityManager.getTransaction().rollback();
            //ex.printStackTrace();
        }
    }

    public void delete(long id) {
        try {
            UserEntity user = EntityManagerHelper.find(UserEntity.class, id);
            EntityManagerHelper.begin();
            EntityManagerHelper.remove(user);
            EntityManagerHelper.commit();
        } catch (Exception ex) {
            ex.printStackTrace();
            EntityManagerHelper.rollback();
        }
    }
}
在delete方法中,我被发送到此行的catch块,但有两个例外:

javax.persistence.RollbackException: Transaction marked as rollbackOnly

我理解第一个,但第二个是出乎意料的

如果我去掉这条线,我将从该线进入捕捉块:

EntityManagerHelper.commit();
第一个异常是相同的,第二个异常是 线程“JavaFX应用程序线程”java.lang.IllegalStateException中的异常:事务未激活

如何解决此问题以避免出现异常