在 EclipseLink 2.7 中没有 select 的更新
Update without select in EclipseLink 2.7
我需要一个不使用 EclipeLink 2.7 select 更新实体的解决方案。 Here 我找到了以下解决方案:
EntityManager entityManager = entityManagerFactory.createEntityManager();
entityManager.getTransaction().begin();
UnitOfWork unitOfWork = ((EntityManagerImpl) entityManager.getDelegate()).getUnitOfWork();
AbstractSession session = unitOfWork.getParent();
session.updateObject(entity);
entityManager.getTransaction().commit();
这就是我得到的:
Caused by: java.lang.ClassCastException: org.eclipse.persistence.internal.sessions.IsolatedClientSession cannot be cast to org.eclipse.persistence.internal.sessions.UnitOfWorkImpl
at org.eclipse.persistence.internal.jpa.metadata.listeners.BeanValidationListener.preUpdate(BeanValidationListener.java:90) ~[org.eclipse.persistence.jpa.jar:na]
at org.eclipse.persistence.descriptors.DescriptorEventManager.notifyListener(DescriptorEventManager.java:726) ~[org.eclipse.persistence.core.jar:na]
at org.eclipse.persistence.descriptors.DescriptorEventManager.notifyEJB30Listeners(DescriptorEventManager.java:696) ~[org.eclipse.persistence.core.jar:na]
at org.eclipse.persistence.descriptors.DescriptorEventManager.executeEvent(DescriptorEventManager.java:233) ~[org.eclipse.persistence.core.jar:na]
at org.eclipse.persistence.internal.queries.DatabaseQueryMechanism.updateObjectForWrite(DatabaseQueryMechanism.java:901) ~[org.eclipse.persistence.core.jar:na]
at org.eclipse.persistence.queries.UpdateObjectQuery.executeCommit(UpdateObjectQuery.java:69) ~[org.eclipse.persistence.core.jar:na]
at org.eclipse.persistence.internal.queries.DatabaseQueryMechanism.executeWrite(DatabaseQueryMechanism.java:259) ~[org.eclipse.persistence.core.jar:na]
at org.eclipse.persistence.queries.WriteObjectQuery.executeDatabaseQuery(WriteObjectQuery.java:60) ~[org.eclipse.persistence.core.jar:na]
at org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:911) ~[org.eclipse.persistence.core.jar:na]
at org.eclipse.persistence.internal.sessions.AbstractSession.internalExecuteQuery(AbstractSession.java:3346) ~[org.eclipse.persistence.core.jar:na]
at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1892) ~[org.eclipse.persistence.core.jar:na]
at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1874) ~[org.eclipse.persistence.core.jar:na]
at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1824) ~[org.eclipse.persistence.core.jar:na]
at org.eclipse.persistence.internal.sessions.AbstractSession.updateObject(AbstractSession.java:4324) ~[org.eclipse.persistence.core.jar:na]
我尝试添加到实体
@ExistenceChecking(ExistenceType.CHECK_CACHE)
public class MyEntity {...}
和
@ExistenceChecking(ExistenceType.ASSUME_EXISTENCE)
public class MyEntity {...}
然而它没有帮助。如何在 EclipseLink 2.7 中不使用 select 进行更新?
编辑
我也试过了
EntityManager entityManager = entityManagerFactory.createEntityManager();
entityManager.getTransaction().begin();
UpdateObjectQuery updateQuery= new UpdateObjectQuery();
updateQuery.setObject(entity);
Session session = ((JpaEntityManager)entityManager.getDelegate()).getUnitOfWork().getParent();
session.executeQuery(updateQuery);
entityManager.getTransaction().commit();
entityManager.close();
但是得到了:
Caused by: java.lang.ClassCastException: org.eclipse.persistence.internal.sessions.IsolatedClientSession cannot be cast to org.eclipse.persistence.internal.sessions.UnitOfWorkImpl
at org.eclipse.persistence.internal.jpa.metadata.listeners.BeanValidationListener.preUpdate(BeanValidationListener.java:90) ~[org.eclipse.persistence.jpa.jar:na]
at org.eclipse.persistence.descriptors.DescriptorEventManager.notifyListener(DescriptorEventManager.java:726) ~[org.eclipse.persistence.core.jar:na]
at org.eclipse.persistence.descriptors.DescriptorEventManager.notifyEJB30Listeners(DescriptorEventManager.java:696) ~[org.eclipse.persistence.core.jar:na]
at org.eclipse.persistence.descriptors.DescriptorEventManager.executeEvent(DescriptorEventManager.java:233) ~[org.eclipse.persistence.core.jar:na]
at org.eclipse.persistence.internal.queries.DatabaseQueryMechanism.updateObjectForWrite(DatabaseQueryMechanism.java:901) ~[org.eclipse.persistence.core.jar:na]
at org.eclipse.persistence.queries.UpdateObjectQuery.executeCommit(UpdateObjectQuery.java:69) ~[org.eclipse.persistence.core.jar:na]
at org.eclipse.persistence.internal.queries.DatabaseQueryMechanism.executeWrite(DatabaseQueryMechanism.java:259) ~[org.eclipse.persistence.core.jar:na]
at org.eclipse.persistence.queries.WriteObjectQuery.executeDatabaseQuery(WriteObjectQuery.java:60) ~[org.eclipse.persistence.core.jar:na]
at org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:911) ~[org.eclipse.persistence.core.jar:na]
at org.eclipse.persistence.internal.sessions.AbstractSession.internalExecuteQuery(AbstractSession.java:3346) ~[org.eclipse.persistence.core.jar:na]
at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1892) ~[org.eclipse.persistence.core.jar:na]
at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1874) ~[org.eclipse.persistence.core.jar:na]
at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1824) ~[org.eclipse.persistence.core.jar:na]
JPA 合并是一种特定的 API,它要求提供商从缓存或数据库中提取您的对象实例,然后将您的实例的更改合并到其中。
UpdateObjectQuery updateQuery= new UpdateObjectQuery();
updateQuery.setObject(myEntityInstance);
Session session = ((JpaEntityManager)em.getDelegate()).getUnitOfWork().getParent();
updated = (MyEntity)session.executeQuery(updateQuery);
当我知道对象已经存在并且不介意将所有字段包含在更新语句中时,而不是合并。这允许我在其他用例中使用合并,当我之前已经在这个上下文中阅读过这个实例,或者我需要确保只更改更新的字段。
@Chris 在评论中指出有必要关闭bean 验证。所以我向 persistence.xml 添加了以下行
<property name="javax.persistence.validation.mode" value="none"/>
然后问题就解决了。
我需要一个不使用 EclipeLink 2.7 select 更新实体的解决方案。 Here 我找到了以下解决方案:
EntityManager entityManager = entityManagerFactory.createEntityManager();
entityManager.getTransaction().begin();
UnitOfWork unitOfWork = ((EntityManagerImpl) entityManager.getDelegate()).getUnitOfWork();
AbstractSession session = unitOfWork.getParent();
session.updateObject(entity);
entityManager.getTransaction().commit();
这就是我得到的:
Caused by: java.lang.ClassCastException: org.eclipse.persistence.internal.sessions.IsolatedClientSession cannot be cast to org.eclipse.persistence.internal.sessions.UnitOfWorkImpl
at org.eclipse.persistence.internal.jpa.metadata.listeners.BeanValidationListener.preUpdate(BeanValidationListener.java:90) ~[org.eclipse.persistence.jpa.jar:na]
at org.eclipse.persistence.descriptors.DescriptorEventManager.notifyListener(DescriptorEventManager.java:726) ~[org.eclipse.persistence.core.jar:na]
at org.eclipse.persistence.descriptors.DescriptorEventManager.notifyEJB30Listeners(DescriptorEventManager.java:696) ~[org.eclipse.persistence.core.jar:na]
at org.eclipse.persistence.descriptors.DescriptorEventManager.executeEvent(DescriptorEventManager.java:233) ~[org.eclipse.persistence.core.jar:na]
at org.eclipse.persistence.internal.queries.DatabaseQueryMechanism.updateObjectForWrite(DatabaseQueryMechanism.java:901) ~[org.eclipse.persistence.core.jar:na]
at org.eclipse.persistence.queries.UpdateObjectQuery.executeCommit(UpdateObjectQuery.java:69) ~[org.eclipse.persistence.core.jar:na]
at org.eclipse.persistence.internal.queries.DatabaseQueryMechanism.executeWrite(DatabaseQueryMechanism.java:259) ~[org.eclipse.persistence.core.jar:na]
at org.eclipse.persistence.queries.WriteObjectQuery.executeDatabaseQuery(WriteObjectQuery.java:60) ~[org.eclipse.persistence.core.jar:na]
at org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:911) ~[org.eclipse.persistence.core.jar:na]
at org.eclipse.persistence.internal.sessions.AbstractSession.internalExecuteQuery(AbstractSession.java:3346) ~[org.eclipse.persistence.core.jar:na]
at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1892) ~[org.eclipse.persistence.core.jar:na]
at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1874) ~[org.eclipse.persistence.core.jar:na]
at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1824) ~[org.eclipse.persistence.core.jar:na]
at org.eclipse.persistence.internal.sessions.AbstractSession.updateObject(AbstractSession.java:4324) ~[org.eclipse.persistence.core.jar:na]
我尝试添加到实体
@ExistenceChecking(ExistenceType.CHECK_CACHE)
public class MyEntity {...}
和
@ExistenceChecking(ExistenceType.ASSUME_EXISTENCE)
public class MyEntity {...}
然而它没有帮助。如何在 EclipseLink 2.7 中不使用 select 进行更新?
编辑
我也试过了
EntityManager entityManager = entityManagerFactory.createEntityManager();
entityManager.getTransaction().begin();
UpdateObjectQuery updateQuery= new UpdateObjectQuery();
updateQuery.setObject(entity);
Session session = ((JpaEntityManager)entityManager.getDelegate()).getUnitOfWork().getParent();
session.executeQuery(updateQuery);
entityManager.getTransaction().commit();
entityManager.close();
但是得到了:
Caused by: java.lang.ClassCastException: org.eclipse.persistence.internal.sessions.IsolatedClientSession cannot be cast to org.eclipse.persistence.internal.sessions.UnitOfWorkImpl
at org.eclipse.persistence.internal.jpa.metadata.listeners.BeanValidationListener.preUpdate(BeanValidationListener.java:90) ~[org.eclipse.persistence.jpa.jar:na]
at org.eclipse.persistence.descriptors.DescriptorEventManager.notifyListener(DescriptorEventManager.java:726) ~[org.eclipse.persistence.core.jar:na]
at org.eclipse.persistence.descriptors.DescriptorEventManager.notifyEJB30Listeners(DescriptorEventManager.java:696) ~[org.eclipse.persistence.core.jar:na]
at org.eclipse.persistence.descriptors.DescriptorEventManager.executeEvent(DescriptorEventManager.java:233) ~[org.eclipse.persistence.core.jar:na]
at org.eclipse.persistence.internal.queries.DatabaseQueryMechanism.updateObjectForWrite(DatabaseQueryMechanism.java:901) ~[org.eclipse.persistence.core.jar:na]
at org.eclipse.persistence.queries.UpdateObjectQuery.executeCommit(UpdateObjectQuery.java:69) ~[org.eclipse.persistence.core.jar:na]
at org.eclipse.persistence.internal.queries.DatabaseQueryMechanism.executeWrite(DatabaseQueryMechanism.java:259) ~[org.eclipse.persistence.core.jar:na]
at org.eclipse.persistence.queries.WriteObjectQuery.executeDatabaseQuery(WriteObjectQuery.java:60) ~[org.eclipse.persistence.core.jar:na]
at org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:911) ~[org.eclipse.persistence.core.jar:na]
at org.eclipse.persistence.internal.sessions.AbstractSession.internalExecuteQuery(AbstractSession.java:3346) ~[org.eclipse.persistence.core.jar:na]
at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1892) ~[org.eclipse.persistence.core.jar:na]
at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1874) ~[org.eclipse.persistence.core.jar:na]
at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1824) ~[org.eclipse.persistence.core.jar:na]
JPA 合并是一种特定的 API,它要求提供商从缓存或数据库中提取您的对象实例,然后将您的实例的更改合并到其中。
UpdateObjectQuery updateQuery= new UpdateObjectQuery();
updateQuery.setObject(myEntityInstance);
Session session = ((JpaEntityManager)em.getDelegate()).getUnitOfWork().getParent();
updated = (MyEntity)session.executeQuery(updateQuery);
当我知道对象已经存在并且不介意将所有字段包含在更新语句中时,而不是合并。这允许我在其他用例中使用合并,当我之前已经在这个上下文中阅读过这个实例,或者我需要确保只更改更新的字段。
@Chris 在评论中指出有必要关闭bean 验证。所以我向 persistence.xml 添加了以下行
<property name="javax.persistence.validation.mode" value="none"/>
然后问题就解决了。