我目前在尝试使用实体管理器中的持久方法保存到数据库时遇到问题。执行它时,它不会产生异常,但不会将对象保存到我的数据库中。读取手动插入的对象确实有效。
通用DAOImpl
package be.greg.PaymentDatabase.DAO;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;
import java.util.Map;
import javax.persistence.Entity;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.transaction.Transactional;
public abstract class GenericDaoImpl<T> implements GenericDao<T> {
@PersistenceContext
protected EntityManager em;
private Class<T> type;
String entity;
@SuppressWarnings({ "unchecked", "rawtypes" })
public GenericDaoImpl() {
Type t = getClass().getGenericSuperclass();
ParameterizedType pt = (ParameterizedType) t;
type = (Class) pt.getActualTypeArguments()[0];
}
@Override
public long countAll(final Map<String, Object> params) {
final StringBuffer queryString = new StringBuffer(
"SELECT count(o) from ");
queryString.append(type.getSimpleName()).append(" o "); …
Run Code Online (Sandbox Code Playgroud) 在我的DAO
课程中,我有一个参考EntityManager
.我想EntityManager
通过使用来访问线程安全的ThreadLocal
.
到目前为止,我的尝试只导致了NullPointerException
s,我似乎无法找到一个体面的例子.
有人可以给我一个例子或指出我正确的方向吗?
更新:我已经尝试过BalusC的建议,但是当我同时通过JSF和JAX-RS webservice访问DAO时,我仍然遇到错误:
org.hibernate.exception.GenericJDBCException: could not load an entity
java.sql.SQLException: You can't operate on a closed Connection!!!
java.lang.NullPointerException
at com.mchange.v2.c3p0.impl.NewProxyConnection.prepareStatement
Run Code Online (Sandbox Code Playgroud)
我正在使用C3P0,所以我不知道为什么闭合连接是个问题.
update2:BalusC的最后评论似乎解决了我的问题:At least, you should not have a single instance of the DAO class shared throughout the application. Create a new one on every request.
我有一个实体定义如下:
public class Version {
@Id
private Long id;
private String content;
@Transient
private Model model;
//...
}
Run Code Online (Sandbox Code Playgroud)
从我所看到的,当find
在Entity Manager上完成一个操作时,它只SELECT
在底层数据库上创建一次,然后在实体管理器中缓存该实体.但是,我看到如果我Model
为model
属性分配了一个,则此更改不会反映到缓存的实体.例如,如果在一次调用中,find
操作已完成并Model
已分配,则当我find
再次从另一个EJB执行操作时,model
属性将null
再次出现.此更改是否未反映到缓存实体?也许是因为它@Transient
?
我想使用entitymanager审核插入,更新,删除等.为此,我怎么能为EntityManager.class做一个可以使用EJB的拦截器???
我有一个使用Spring-EntityManager(JPA)的应用程序,我想知道如果数据库在我的上述应用程序的生命周期中恰好不可用会发生什么.
我希望在那种情况下它会在第一次对数据库做任何事情时抛出异常,对吗?
但是,比如我等了10分钟然后再试一次,然后DB回来了.它会恢复吗?我可以这样安排吗?
谢谢
来自实体框架背景我可以将我的ORM结果转换为包含完整后端模型数据子集的类.
我有一个JAX-RS REST服务,我通常会返回类似的东西
MyEntity result = em.createQuery(select e from MyEntity e ... blah blah blah).
Run Code Online (Sandbox Code Playgroud)
我知道我可以这样做:
Object result = em.createQuery(select e.Title, e.Version, e.Date from MyEntity e... blah blah blah).
Run Code Online (Sandbox Code Playgroud)
但是,我可以:将我的结果转换为单独的类,或者在我的createquery中命名我的字段,以便在返回我的JSON时命名它们吗?
例如在.Net Land我可以做类似......
(select new {Title = e.Title, Version = e.Version})
Run Code Online (Sandbox Code Playgroud)
然后将其转换为另一种类型.我尝试使用typedquery和cast但是我得到了"Type X与返回类型Y不兼容"类型错误.
我的目标是返回我的信息的特定子集(视图模型/ DTO),以便在特定场景中使用.
例如,我的模型非常庞大,我不希望每次都返回大量数据.
我是JTA的新手,我需要一个方法来从数据库中检索一些元素.我可以通过EntityManager执行此操作,但这仅适用于ResourceLocal.我想知道我该怎么做:
Query q = em.createNamedQuery("AnyQuery");
q.getResultList();
Run Code Online (Sandbox Code Playgroud)
不使用EntityManager.有任何想法吗?
我正在研究一个Symfony2项目(Doctrine),我想从ResultSetMapping对象中获取一个简单的关联数组.
这是我的要求:
$rsm = new ResultSetMapping;
//$rsm->addIndexByScalar('name');
$rsm->addScalarResult('name', 'name');
$rsm->addScalarResult('rate', 'rate');
return $this->_em->createNativeQuery(sprintf('
SELECT DISTINCT t1.sold_drug as name, (COUNT(*)/(SELECT COUNT(*) FROM Transaction t WHERE t.sold_drug != ""))*100 as rate
FROM Transaction t1
WHERE t1.sold_drug != "" AND t1.prescribed_but_not_sold != "No"
GROUP BY name
ORDER BY rate DESC', $this->getFilterQuery()), $rsm)->getResult();
Run Code Online (Sandbox Code Playgroud)
所以我想得到一个关联数组,如:
array('nameA' => 10, 'nameB' => 2, ...);
Run Code Online (Sandbox Code Playgroud)
我试图添加ScalarResult/ScalarIndex但没有成功!
任何的想法 ?谢谢 !
doctrine associative-array entitymanager sqlresultsetmapping symfony
我正在使用JPA EntityManager + Hiberate,并且出现了一个非常重要的where子句.来自Hibernate的调试基本上显示:
select /* bunch of columns */
from some_table
where /* several filters */
and 0=1
Run Code Online (Sandbox Code Playgroud)
运行时会发生这种情况javax.persistence.Query.getResultList
.该Query
有数组Predicates
的where子句中,但放心,0 = 1
是不是其中之一.
我找不到该0=1
部分包含在查询中的可能原因.有任何想法吗?我先找一个答案,但搜索引擎会忽略=
.
我第一次使用Java来调用SP,所以这可能是我忽略的一个简单问题.
我有几种方法,我正在尝试这样做,并在两者上都遇到错误.
EM是被声明了类高一个EntityManager,我已经调试期间检查它与数据库的连接是否正确.
第一个是使用StoredProcedureQuery抛出错误;
javax.persistence.PersistenceException:org.hibernate.SQLGrammarException:错误调用CallableStatement.getMoreResults
try {
StoredProcedureQuery query = em.createStoredProcedureQuery("usp_myProc");
query.registerStoredProcedureParameter(0, Integer.class, ParameterMode.IN);
query.setParameter(0, id);
query.execute();
}
catch (Exception ex) {
log.error(ex.toString());
}
Run Code Online (Sandbox Code Playgroud)
我的第二次尝试是尝试使用本机查询(当我阅读文档时听起来是正确的)
try {
Query query1 = em.createNativeQuery("EXEC usp_myProc ?");
query1.setParameter(1, id);
Integer val = (Integer) query1.getSingleResult();
}
catch (Exception ex) {
log.error(ex.toString());
}
Run Code Online (Sandbox Code Playgroud)
程序已经被简化为一个简单的"选择1",以确保这不是问题.
PROCEDURE [usp_myProc]
-- Add the parameters for the stored procedure here
@id INT
AS
BEGIN
SELECT 1
END
Run Code Online (Sandbox Code Playgroud)
我有一个谷歌(这是我从中获取本机查询代码的地方),但无法获得任何回报.即使只是一个不返回值的存储过程调用,对我来说也是一个神的结果.
谢谢你提供的所有帮助.
entitymanager ×10
jpa ×7
java ×5
hibernate ×3
ejb ×2
spring ×2
dao ×1
doctrine ×1
jta ×1
persistence ×1
sql-server ×1
symfony ×1
thread-local ×1