java.lang.IllegalStateException:事务已处于活动状态,事务未处于活动状态
我有一个JavaFX应用程序,它通过JPA技术访问MySQL数据库 以下是我在应用程序中创建和使用实体管理器的方法: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
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中的异常:事务未激活
如何解决此问题以避免出现异常