我开发了一个使用Open Jpa 2.1的休息Web服务,部署在TomEE中。
我的问题是,当我运行select query时,更新查询正在表中运行,我可以在日志中看到。
我注意到,当我遍历结果列表时,只会调用Update并为结果列表中的所有记录调用update。
日志
DEBUG 2016-04-18 13:23:48,766 [http-bio-28080-exec-3] openjpa.Runtime - Found datasource1: datasource 9932945 from configuration. StoreContext: org.apache.openjpa.kernel.BrokerImpl@1d4022a
DEBUG 2016-04-18 13:23:48,766 [http-bio-28080-exec-3] openjpa.Runtime - org.apache.openjpa.persistence.EntityManagerFactoryImpl@b7962e created EntityManager org.apache.openjpa.persistence.EntityManagerImpl@1d4022a.
DEBUG 2016-04-18 13:23:48,772 [http-bio-28080-exec-3] openjpa.Runtime - Query "select p from EHSDo p " is cached."
DEBUG 2016-04-18 13:23:48,772 [http-bio-28080-exec-3] openjpa.Query - Executing query: select p from EHSDo p
DEBUG 2016-04-18 13:23:48,780 [http-bio-28080-exec-3] openjpa.jdbc.SQL - <t 17558940, conn 4067012> executing prepstmnt 21581928 SELECT t0.ID, t0.NAME FROM EHS t0
DEBUG 2016-04-18 13:23:48,780 [http-bio-28080-exec-3] openjpa.jdbc.SQL - <t 17558940, conn 4067012> [0 ms] spent
DEBUG 2016-04-18 13:23:48,781 [http-bio-28080-exec-3] openjpa.jdbc.JDBC - <t 17558940, conn 4067012> [0 ms] close
DEBUG 2016-04-18 13:23:48,784 [http-bio-28080-exec-3] openjpa.jdbc.JDBC - The batch limit is set to 0.
DEBUG 2016-04-18 13:23:48,784 [http-bio-28080-exec-3] openjpa.jdbc.SQL - <t 17558940, conn 20831240> executing prepstmnt 5407641 UPDATE EHS SET NAME = ? WHERE ID = ? [params=?, ?]
DEBUG 2016-04-18 13:23:48,785 [http-bio-28080-exec-3] openjpa.jdbc.SQL - <t 17558940, conn 20831240> [1 ms] spent
DEBUG 2016-04-18 13:23:48,834 [http-bio-28080-exec-3] openjpa.jdbc.JDBC - <t 17558940, conn 20831240> [0 ms] close
DEBUG 2016-04-18 13:23:48,835 [http-bio-28080-exec-3] openjpa.Runtime - org.apache.openjpa.persistence.EntityManagerImpl@1d4022a.close() invoked.
REST代码
@Path("rest")
public class Rest {
private static final Logger logger = LoggerFactory.getLogger(Rest.class);
@EJB
EHSBeansLocal ehsBean;
@GET
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
@Path("getAllEHS")
public List<EHSDto> getAllEHS() {
logger.debug("--------------------------- getAllEHS -----------------------------");
return ehsBean.getAllEHS();
}
}
EJB代码
@Stateless
public class EHSBeans implements EHSBeansLocal {
private static final Logger logger = LoggerFactory.getLogger(EHSBeans.class);
@PersistenceContext(unitName="EHS_PU")
private EntityManager em;
public EHSBeans(){
logger.debug("EHSBean constructor called");
}
@Override
public List<EHSDto> getAllEHS(){
logger.debug("getAllEHS");
List<EHSDto> dtolist = new ArrayList<EHSDto>();
Query query = em.createQuery("select p from EHSDo p ");
List<EHSDo> list = query.getResultList();
if (list != null){
for(EHSDo entity : list){
EHSDto e = new EHSDto();
e.setId(entity.getId());
e.setName(entity.getName());
dtolist.add(e);
}
}
return dtolist;
}
}
坚持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="EHS_PU">
<jta-data-source>mysqlDataSource</jta-data-source>
<class>com.ap.entity.EHSDo</class>
<properties>
<property name="openjpa.Log" value="log4j" />
</properties>
</persistence-unit>
</persistence>
tomee.xml中的数据源
<Resource id="mysqlDataSource" type="javax.sql.DataSource">
JdbcDriver com.mysql.jdbc.Driver
JdbcUrl jdbc:mysql://localhost:3306/jpa
UserName root
Password root
JtaManaged true
DefaultAutoCommit true
InitialSize 3
MaxActive 20
MinIdle 20
MaxIdle 0
MaxWait 50000
ValidationQuery SELECT 1
TestOnBorrow true
TestOnReturn false
TestWhileIdle false
</Resource>