任何人都可以解释Spring Framework的LocalContainerEntityManagerFactoryBean和LocalEntityManagerFactoryBean之间的区别是什么?
有人能告诉我如何获得一个标有"编辑"ACL权限的类型的所有实体吗?
我想用Doctrine EntityManager构建一个查询.
我有2个实体:Country(id,name)和Mapping(id,object,internalId,externalId).国家和地图未与关联相关联(因为"映射"不仅包含国家/地区的行).我需要使用以下条件获取国家/地区的外部ID:
country.id = mapping.internalIdmapping.object = 'country'所以我计划在Country中添加函数getExternalId()
function getExternalId() {
$em = Registry::getEntityManager();
$mapping = $em->getRepository('Mapping')->findOneBy(array(
'object' => 'country',
'internalId' => $this->getId()
));
return !empty($mapping) ? $mapping->getExternalId() : false;
}
Run Code Online (Sandbox Code Playgroud)
问题:
提前致谢!
我在创建EntityManager时看到的常用习惯是这样的:
public class BaseDao {
private static final String PERSISTENCE_UNIT_NAME = "Employee";
EntityManagerFactory factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
public EntityManager getEntityManager() {
return factory.createEntityManager();
}
}
Run Code Online (Sandbox Code Playgroud)
然后就像这样使用:
Employee emp = new Employee();
emp.setName("Joe M");
getEntityManager().persist(emp);
Run Code Online (Sandbox Code Playgroud)
问题是为什么不这样做:
public class BaseDao{
private static final String PERSISTENCE_UNIT_NAME = "Employee";
EntityManagerFactory factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
private EntityManager entityManager = null;
public void setEntityManger() {
EntityManagerFactory factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
this.entityManager = factory.createEntityManager();
}
public EntityManager getEntityManager() {
return this.entityManager;
}
}
Run Code Online (Sandbox Code Playgroud)
换句话说,是否需要始终通过factory.createEntityManager()获取实体管理器?或者它可以创建为实例(甚至静态)变量并像这样检索?
为了澄清,我在谈论一个不使用EJB或Spring容器的环境.
谢谢.
我需要模拟实体管理器来使测试服务层(在我的情况下是一个会话外观)独立于底层(在我的例子中是实体管理器).
那么我怎么能做到这一点?我应该使用dbunit吗?我需要easy/j(模拟)吗?
到目前为止,我有一个具有持久性的Spring应用程序.但是现在我想使用Hibernate和JPA来完成我的所有数据库活动.我想使用entitymanager来做这件事.
我一直在阅读有关此问题的许多文档和教程,我一直对是否需要persistence.xml文件感到困惑.此外,我也对如何设置applicationContext.xml文件感到困惑.
有没有人知道一个好的网站,以便使用EntityManager学习Spring + Hibernate + JPA +?
我有一个EntityManagerFactory我可以创建一个(或多个)EntityManager实例.我正在使用Servlet环境,并且我有一个EntityManagerFactory连接到servlet(通过servlet上下文),它在servlet的生命周期内共享(因此,对于所有用户).
我可以做以下其中一项:
doGet方法结束时关闭它)哪个最合适?创建EntityManager的成本是否显着?如果我做一个共享的EntityManager,是否有一个事务范围(即独立用户之间的更新可以提交其他更改)?
我有使用JPA的Web应用程序.这个实体管理器保留了大量的实体,突然间我从另一侧更新了数据库.我使用MySQL,我使用PhpMyAdmin并更改一些行.
如何告诉实体经理重新同步,例如忘记缓存中的所有entite?
我知道有refresh(Object)方法,但是有什么可能做什么refreshAll()或什么导致这个?
这肯定是昂贵的操作,但如果必须这样做.
我有一个LocalContainerEntityManagerFactoryBean为EntityManager实例.
要快速删除整个表的内容,我想运行以下代码:
@Service
public class DatabaseService {
@Autowired
private EntityManager em;
@Transactional
public void clear() {
em.createNativeQuery("TRUNCATE TABLE MyTable").executeUpdate();
}
}
Run Code Online (Sandbox Code Playgroud)
结果:
ERROR org.springframework.integration.handler.LoggingHandler: javax.persistence.TransactionRequiredException: Executing an update/delete query
at org.hibernate.jpa.spi.AbstractQueryImpl.executeUpdate(AbstractQueryImpl.java:71)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:708)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:98)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:262)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:644)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:65)
at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:304)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:178)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:744)
Run Code Online (Sandbox Code Playgroud)
如果我做了这个改变:
public …Run Code Online (Sandbox Code Playgroud) 好的,我阅读了一些文章/示例如何在单例中编写实体管理器工厂.
其中一个对我来说最容易理解:
http://javanotepad.blogspot.com/2007/05/jpa-entitymanagerfactory-in-web.html
我了解到EntityManagerFactory(EMF)应该只在应用程序范围内创建一次.
并确保在使用后关闭EMF(?)
所以我编写了EMF helper类来使用的业务方法:
public class EmProvider {
private static final String DB_PU = "KogaAlphaPU";
public static final boolean DEBUG = true;
private static final EmProvider singleton = new EmProvider();
private EntityManagerFactory emf;
private EmProvider() {}
public static EmProvider getInstance() {
return singleton;
}
public EntityManagerFactory getEntityManagerFactory() {
if(emf == null) {
emf = Persistence.createEntityManagerFactory(DB_PU);
}
if(DEBUG) {
System.out.println("factory created on: " + new Date());
}
return emf;
}
public void closeEmf() {
if(emf.isOpen() || emf …Run Code Online (Sandbox Code Playgroud) entitymanager ×10
java ×7
jpa ×7
spring ×3
hibernate ×2
acl ×1
doctrine ×1
doctrine-orm ×1
mocking ×1
singleton ×1
spring-orm ×1
symfony ×1
unit-testing ×1