在我的项目中使用 mvn install 后,我遇到了一个奇怪的问题。
如果我首先运行 mvn clean,然后在 Eclipse 中启动我的项目,我没有问题。
运行 mvn install (我需要这个命令来生成带有程序集的 jar)并重新启动项目后,由于事务未打开,我在使用休眠状态保存数据时出现奇怪的异常。
其中之一:
java.lang.RuntimeException: java.lang.IllegalArgumentException: id to load is required for loading
at com.econorma.ft2500.util.concurrent.UserTransactionRunnable.run(UserTransactionRunnable.java:20)
at com.econorma.ft2500.util.concurrent.ContextAwareExectuor$CDIRunnable.run(ContextAwareExectuor.java:67)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:178)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:292)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.IllegalArgumentException: id to load is required for loading
at org.hibernate.event.spi.LoadEvent.<init>(LoadEvent.java:109)
at org.hibernate.event.spi.LoadEvent.<init>(LoadEvent.java:79)
at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.load(SessionImpl.java:2548)
at org.hibernate.internal.SessionImpl.get(SessionImpl.java:955)
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.find(AbstractEntityManagerImpl.java:1110)
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.find(AbstractEntityManagerImpl.java:1068)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.jboss.weld.bean.proxy.AbstractBeanInstance.invoke(AbstractBeanInstance.java:38)
at org.jboss.weld.bean.proxy.ProxyMethodHandler.invoke(ProxyMethodHandler.java:100)
at org.jboss.weld.proxies.EntityManager$827868750$Proxy$_$$_WeldClientProxy.find(Unknown Source)
at com.econorma.ft2500.MeasureCache$UpdateLatestMeasure.runInTransaction(MeasureCache.java:136)
at com.econorma.ft2500.util.concurrent.UserTransactionRunnable.run(UserTransactionRunnable.java:16)
... 8 more
这是我的 beans.xml 正确放置在 src/main/resources/META-INF 中:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
<interceptors>
<class>com.econorma.ft2500.cdi.SynchronizedInterceptor</class>
<class>org.apache.deltaspike.jpa.impl.transaction.TransactionalInterceptor</class>
</interceptors>
事务类:
public abstract class UserTransactionRunnable implements Runnable{
protected @Inject EntityManager em;
@Override
public void run() {
EntityTransaction transaction = em.getTransaction();
transaction.begin();
try{
runInTransaction();
transaction.commit();
}catch(Exception e){
transaction.rollback();
throw new RuntimeException(e);
}finally{
}
}
protected abstract void runInTransaction();
}
我的考虑是生成 TARGET 文件夹的 mvn install 命令失去了与 beans.xml 的连接。