小编Sib*_*Ter的帖子

何时使用EntityManager.find()与EntityManager.getReference()一起使用JPA

我遇到过一种情况(我觉得很奇怪,但可能很正常),我使用EntityManager.getReference(LObj.getClass(),LObj.getId())获取数据库实体,然后将返回的对象传递给坚持在另一张桌子上.

所以基本上流程是这样的:

class TFacade{

  createT(FObj, AObj) {
    T TObj = new T();
    TObj.setF(FObj);
    TObj.setA(AObj);
    ...
    EntityManager.persist(TObj);
    ...
    L LObj = A.getL();
    FObj.setL(LObj);
    FFacade.editF(FObj);
  }
}

@TransactionAttributeType.REQUIRES_NEW
class FFacade{

  editF(FObj){
    L LObj = FObj.getL();
    LObj = EntityManager.getReference(LObj.getClass(), LObj.getId());
    ...
    EntityManager.merge(FObj);
    ...
    FLHFacade.create(FObj, LObj);
  }
}

@TransactionAttributeType.REQUIRED
class FLHFacade{

  createFLH(FObj, LObj){
    FLH FLHObj = new FLH();
    FLHObj.setF(FObj);
    FLHObj.setL(LObj);
    ....
    EntityManager.persist(FLHObj);
    ...
  }
}

我得到以下异常"java.lang.IllegalArgumentException:未知实体:com.my.persistence.L $$ EnhancerByCGLIB $$ 3e7987d0"

在查看了一段时间之后,我终于想通了,因为我正在使用EntityManager.getReference()方法,因为该方法正在返回代理,所以我得到了上述异常.

这让我想知道,何时建议使用EntityManager.getReference()方法而不是EntityManager.find()方法

如果EntityManager.getReference()无法找到正在搜索的实体本身非常方便,则会抛出EntityNotFoundException.如果EntityManager.find()方法无法找到实体,则它仅返回null.

关于事务边界,听起来像你需要在将新发现的实体传递给新事务之前使用find()方法.如果你使用getReference()方法,那么你可能会遇到类似我的情况,但有上述异常.

java persistence jpa java-ee

98
推荐指数
4
解决办法
13万
查看次数

将数据保存到JSF中的会话

我是J(2)EE和Web应用程序开发世界的新手,但我很快就在我身边学习并学习了很多东西.每一天都是我新发现的奇妙之旅.

我目前正在开发一个项目,我在Glassfish v2上使用Visual JSF Woodstock.我对JSF也很陌生.

有时我需要在请求之间保存一些对象(例如MyObject).从我到目前为止所阅读和理解的内容来看,我需要使用会话来在不同请求之间保存这些对象.到现在为止还挺好.

究竟如何做到这一点是我担心的地方.我知道在JSP中你可以使用session.setAttribute("myObj", myObject)使用cookie或url重写或隐藏的表单变量来保存客户端对象.

另一方面,在JSF中,我使用Session scoped bean,比如说SessionBean1,并将对象保存为SessionBean1属性(例如SessionBean1.setSomeOjb(myObj)).这是正确的方法吗?

我猜这样做会导致服务器端的内存利用率增加,因为每个请求都会创建会话范围bean的新实例,SessionBean1加上SessionBean1中保存的myObject实例使用的内存.

我已经读过你可以使用FacesContext.getExternalContext().getSession/getSessionMap()哪个会在客户端保存会话变量.

那么您建议我使用哪种方法 - 会话范围bean或会话映射来保存对象以便在会话请求之间进行访问?

谢谢.

jsf session-variables session-state

23
推荐指数
2
解决办法
8万
查看次数

@Cache注释使用错误

我添加了以下注释以启用我的EJB3实体之一的缓存,以使用ehCache测试缓存,其中我使用Hibernate作为持久性提供程序:

....
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;

@Entity
@Table(name = "F")
@Cache(usage=CacheConcurrencyStrategy.READ_WRITE)
@NamedQueries({ @NamedQuery(name = "F.findAll", query = "SELECT f FROM F f")})
public class F implements Serializable {
   .....
}
Run Code Online (Sandbox Code Playgroud)

我在persistence.xml中添加了以下内容:

<property name="hibernate.cache.provider_class" value="org.hibernate.cache.EhCacheProvider"/>
<property name="hibernate.cache.provider_configuration_file_resource_path" value="/ehcache.xml"/>
<property name="hibernate.cache.use_second_level_cache" value="true"/>
Run Code Online (Sandbox Code Playgroud)

当我尝试编译时,我收到以下错误:

/persistence/F.class):警告:无法在类型'org.hibernate.annotations.Cache'中找到注释方法'usage()':org.hibernate.annotations.Cache的类文件未找到编译器中发生异常(1.6.0_16).在检查Bug Parade重复项后,请在Java Developer Connection(http://java.sun.com/webapps/bugreport)上提交一个错误.在报告中包含您的计划和以下诊断.谢谢.com.sun.tools.javac.code.Symbol $ CompletionFailure:未找到org.hibernate.annotations.CacheConcurrencyStrategy的类文件

任何人都可以帮助我,让我知道我目前需要做什么或做错了什么?

caching hibernate ehcache ejb-3.0 java-ee-5

10
推荐指数
1
解决办法
1万
查看次数