首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否丢失了JPA唯一约束的事务?

是否丢失了JPA唯一约束的事务?
EN

Stack Overflow用户
提问于 2010-08-17 15:10:05
回答 2查看 2.6K关注 0票数 0

我有一个具有唯一约束的字段:

代码语言:javascript
运行
复制
@Column(unique=true)
private String uriTitle;

当我尝试用相同的值保存两个实体时,我得到了一个异常--但这是我所执行的另一个异常:

代码语言:javascript
运行
复制
java.lang.IllegalStateException: <|Exception Description: No transaction is currently active
        at org.eclipse.persistence.internal.jpa.transaction.EntityTransactionImpl.rollback(EntityTransactionImpl.java:122)
        at com.example.persistence.TransactionFilter.doFilter(TransactionFilter.java:35)

有问题的filter方法如下所示:

代码语言:javascript
运行
复制
public void doFilter(ServletRequest request, ServletResponse response,
          FilterChain chain)
          throws IOException, ServletException {
    EntityManager entityManager = ThreadLocalEntityManager.get();
    EntityTransaction transaction = entityManager.getTransaction();
    transaction.begin();
    try {
      chain.doFilter(request, response);
      transaction.commit();
    }
    catch (Throwable t) {
      transaction.rollback();  // line 35, mentioned in the exception
      throw new RuntimeException(t);
    }
    finally {
      entityManager.close();
      ThreadLocalEntityManager.reset();
    }
}

..。ThreadLocalEntityManager如下所示:

代码语言:javascript
运行
复制
public class ThreadLocalEntityManager {

    private static EntityManagerFactory entityManagerFactory = null;
    private static final ThreadLocal<EntityManager> entityManager =
        new ThreadLocal<EntityManager>() {
            @Override 
            protected EntityManager initialValue() {
                return entityManagerFactory.createEntityManager();
            }
        };

    private ThreadLocalEntityManager() {}

    public static synchronized void init(String persistenceUnit) {
        requireNotNull(persistenceUnit);
        requireState(entityManagerFactory == null, "'init' can be called only "
                        + "once.");
        entityManagerFactory =
                        Persistence.createEntityManagerFactory(persistenceUnit);
    }

    public static EntityManager get() {
        requireState(entityManagerFactory != null, "Call 'init' before calling "
                        + "'get'");
        return entityManager.get();
    }

    public static void reset() {
        entityManager.remove();
    }

}

我用try ...catch包装了对save的调用,以处理唯一约束冲突,但这不起作用:

代码语言:javascript
运行
复制
try {
    ThreadLocalEntityManager.get().persist(article); // article is constrained
}
catch(Throwable t) {
    t.printStackTrace();
}

你知道为什么没有交易吗?处理唯一约束冲突的正确方法是什么?

EN

Stack Overflow用户

发布于 2012-10-16 19:39:35

在您的应用程序中,事务和GUI之间没有任何分离。一般情况下,您会遇到事务处理方面的问题。

票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3500096

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档