题
什么是最简单的方法来分离一个特定的访问用户实体豆就是获得通过。.或者,我可以查询的返回分离的对象首先,使他们基本上将作为"只读"?
因为我想这样做是因为我想要修改的内的数据豆-在我的应用程序,但没有持续到该数据库。在我的节目,我最后要呼flush()上。这将持续存在的所有变化从附实体的underyling数据库,但我希望排除特定的对象。
解决方案
不幸的是,有没有办法断开一个对象从实体经理在目前的访问用户的实施,AFAIR.
。.明()会断开 所有 该访问用户的对象,因此,可能不是一个适当的解决方案在所有情况下,如果你有其他的对象你这样做的计划,以保持连接。
所以你最好的选择就是要克隆的目的,并通过克隆的代码变化的对象。由于原始的和不可变的目的领域是照顾通过默认的性克隆的机构以适当的方式,你就不必编写大量的水管码(除了深刻的克隆的任何聚集的结构可能有)。
其他提示
(可能已经太晚到的答复,但可以用于其他人)
我是发展我的第一个系统与访问用户的权利。不幸的是,我所面临的这个问题时,这一系统几乎完成。
简单的说.使用休眠,或者等待访问用户2.0.
在冬眠,可以使用'会议。驱逐(object)'删除一个对象从会议。在 访问用户2.0, 在草案现在, 还有'。.分离(object)'的方法来分离一个对象从持久性上下文。
无论其访问用户的实施使用,只是使用 entityManager.detach(object)
它现在在访问用户2.0和部分JEE6.
如果你需要分离的对象的。你使用的休眠因为你根本奥姆层你可以获得 休眠届会议 目的和使用 会议。驱逐(Object) 方法,毛里西奥*加拿大上面提到的。
public void detach(Object entity) {
org.hibernate.Session session = (Session) entityManager.getDelegate();
session.evict(entity);
}
当然,这将打破,如果切换到另一个对象提供程序,但我认为这是最好来试图使一个深深的副本。
据我所知,唯一直接的方式来做到这一点的是:
- 提交txn可能不是一个合理的选择
- 清除持久性上下文。.明()-这是残酷的,但要清除它
- 复制的对象大多数时候,你的访问用户的对象是序列化,所以这应该是很容易(如果不是特别有效).
如果使用 EclipseLink
你也有选择,
使用的查询提示, eclipselink.maintain-cache"="false
-所有返回的目的将是分离的。
使用 EclipseLink
JpaEntityManager
copy()
API为复制目的所需的深度。
如果没有太多的属性在bean,你可能只是创建一个新的实例和设置的所有其属性手动持续豆。
这可以实施的作为复制构造,例如:
public Thing(Thing oldBean) {
this.setPropertyOne(oldBean.getPropertyOne());
// and so on
}
然后:
Thing newBean = new Thing(oldBean);
这是快速和肮脏的,但你还可以列化和deserialize的对象。
因为我使用缝线和访问用户1.0和我的系统有一个fuctinality,需要记录所有领域的变化,我已经创建了一个值目或数据传送对象如果同领域的实体,需要加以记录。构造的新的组成是:
public DocumentoAntigoDTO(Documento documentoAtual) {
Method[] metodosDocumento = Documento.class.getMethods();
for(Method metodo:metodosDocumento){
if(metodo.getName().contains("get")){
try {
Object resultadoInvoke = metodo.invoke(documentoAtual,null);
Method[] metodosDocumentoAntigo = DocumentoAntigoDTO.class.getMethods();
for(Method metodoAntigo : metodosDocumentoAntigo){
String metodSetName = "set" + metodo.getName().substring(3);
if(metodoAntigo.getName().equals(metodSetName)){
metodoAntigo.invoke(this, resultadoInvoke);
}
}
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
}
在访问用户1.0(测试采用EclipseLink)你可以检索的实体以外的交易。例如,容器管理交易你能做的事:
public MyEntity myMethod(long id) {
final MyEntity myEntity = retrieve(id);
// myEntity is detached here
}
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public MyEntity retrieve(long id) {
return entityManager.find(MyEntity.class, id);
}
做处理一个类似的案件我已经创建了一个对象,也可与检延伸的持久性实体对象如下:
class MyEntity
{
public static class MyEntityDO extends MyEntity {}
}
最后,一个标查询检索所需的无管理的属性:
(Hibernate) select p.id, p.name from MyEntity P
(JPA) select new MyEntity(p.id, p.name) from myEntity P
如果你得到这里,因为你实际上想要通过一个实体跨越遥远的边界,那么你只是把一些代码在欺骗hibernazi.
for(RssItem i : result.getChannel().getItem()){
}
可复制的不会的工作,因为它实际上将PersistantBag。
忘记关于使用的序列化和组流和管道的流。创建线程,以避免僵局杀死的整个概念。
我认为有一种方法,驱逐一个单一的实体。通过这个叫
EntityManagerFactory emf;
emf.getCache().evict(Entity);
这将消除特定的实体从高速缓存。
我认为你还可以使用的方法。.刷新的(象o)如果主要钥匙的该实体没有被改变。这种方法将恢复原状的实体。