我正在尝试为具有注入的 EntityManager 的无状态会话 bean 编写 JUnit 测试:
@Stateless
public class MyServiceBean implements MyService, ... {
@PersistenceContext
private EntityManager em;
....
Run Code Online (Sandbox Code Playgroud)
当然,如果不做任何事情,em在测试流程中仍然为空......
测试应该独立运行(而不是在 Java EE 容器中)。
请问我该怎么做?(简单的解决方案将受到高度赞赏:-)
我正在开始一个新项目,我对JPA/Hibernate的使用完全不熟悉.我正在尝试了解如何正确使用EntityManager.更准确地说,何时实例化它们,我需要多少,如果我关闭它们,我应该把所有东西都放到交易中吗?
无论如何,在我当前的代码中,我在尝试读取之前保存的实体时遇到了org.hibernate.LazyInitializationException.我会理解相反的事情(在事务中读取一个antity然后尝试在另一个事务中保存读取实体但是由于事务已经结束,实体是非托管的,因此保存失败),但这是我无法理解的.
我把我的代码放在GitHub上(https://github.com/GaetanLeu/intl),它只是几个类.我的主要是在src/sandbox/MessageSandbox.java中,它在第28行失败,带有以下stacktrace:
Exception in thread "main" org.hibernate.LazyInitializationException: could not initialize proxy - no Session
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:164)
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:285)
at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:185)
at entity.MessageKey_$$_jvstfcc_0.toString(MessageKey_$$_jvstfcc_0.java)
at java.lang.String.valueOf(String.java:2854)
at java.lang.StringBuilder.append(StringBuilder.java:128)
at com.google.common.base.Present.toString(Present.java:88)
at java.lang.String.valueOf(String.java:2854)
at java.io.PrintStream.println(PrintStream.java:821)
at sandbox.MessageSandbox.main(MessageSandbox.java:28)
Run Code Online (Sandbox Code Playgroud)
另外我收到来自Hibernate的警告说我的EntityManager已经存在,那么会发生什么?EntityManagerFactory.createEntityManager方法是否返回现有的方法?
WARN: HHH000436: Entity manager factory name (intl) is already registered. If entity manager will be clustered or passivated, specify a unique value for property 'hibernate.ejb.entitymanager_factory_name'
Run Code Online (Sandbox Code Playgroud)
真的,我迷失了什么时候创建EntityManagers ^^任何帮助将不胜感激,但请简单的解释我真的很新.
哦顺便说一下,我想确切地说我没有使用Spring,我没有EJB,我想现在手动操作EntityManagers直到我理解它为止.谢谢 :)
我想延长EntityManager使用的原则EntityManagerDecorator,并与参考基地遇到了问题EntityManager在UnitOfWork传递到存在prePersist通过事件$eventArgs。
它看起来像EntityManager被传递到UnitOfWork在EntityManager::__construct的时候UnitOfWork被创建。
我想到了一个解决方案可能是,我可以替代默认UnitOfWork的MyEntityManagerDecorator::getUnitOfWork(),如:
public function getUnitOfWork()
{
if ($this->unitOfWork === null) {
$this->unitOfWork = new UnitOfWork($this);
}
return $this->unitOfWork;
}
Run Code Online (Sandbox Code Playgroud)
但是我注意到UnitOfWork::__construct()需要一个EntityManagernot anEntityManagerInterface所以这是行不通的。
我正在寻找如何MyEntityManagerDecorator从 prePersist$eventArgs->getEntityManager()而不是 base 中获取EntityManager。我想这样做,而不直接继承的EntityManager。文档还说“您永远不应该尝试从 EntityManager 继承:继承不是 EntityManager 的有效扩展点。” .
我不确定您需要什么代码示例(如果有),所以如果您需要更多信息,请告诉我。我可以MyEntityManagerDecorator按预期访问项目中的其他任何地方(到目前为止我已经尝试过)。我yml像这样设置装饰器:
my_multi_tenant_entity_manager:
public: false …Run Code Online (Sandbox Code Playgroud) 我有一个脚本将循环中的一些“A”类型的新实体保存到数据库中。但是循环会抛出一些关闭 entityManager 的异常。所以必须重开。它导致应该与每个“A”实体连接的另一个“B”类型的实体与 unitOfWork 分离。如何将“B”附加到 unitOfWork?这是一个例子:
public function insert( Array $items )
{
$B = $this->bRepository->findOneBy( ['name' => 'blog'] );
$result = [ 'errors' => [], 'saved_items' => [] ];
foreach( $items as $item )
{
try
{
$A = new Entity\A();
$A->create([
'name' => $item->name,
'B' => $B // Here is the problem after exception. $B is detached.
]);
$this->em->persist( $A );
$this->em->flush( $A );
$result['saved_items'][] = $item->name;
} catch( \Eception $e )
{
$result['errors'][] = 'Item ' . …Run Code Online (Sandbox Code Playgroud) 我正在制作一个数据库迁移工具,并且正在处理一个非常笨拙的源数据库。它基本上是一张具有 40-50 列以上的巨型表格。然而,并非所有这些专栏对我都有用。我只想要大约十几个。获得该数据后,我将向 Web 服务发出请求,该服务将处理迁移目标端的所有内容。
我的选择基本上是手动创建查询以仅选择我想要的列,或者创建一个映射我想要的列的实体。我不太熟悉使用 JPA,所以我不确定这是否可能或可以。
我可以做类似的事情吗
@Entity
class SomeEntity{
@Column(name = "ColumnA")
private String columnA;
@Column(name = "ColumnB")
private String columnB;
}
Run Code Online (Sandbox Code Playgroud)
例如,如果数据库中的列是
Column A | Column B | Column C | Column D
Run Code Online (Sandbox Code Playgroud)
EclipseLink 会仅映射我注释的列,还是会抱怨尝试将数据库中的列映射到我的实体中不存在的字段?我知道 @Transient 会标记不应保留的字段。但我想做相反的事情,忽略数据库列,只将表部分映射到类。
我有一个实用程序类,如下所示.我希望能够将此类与RESOURCE_LOCAL或JTA持久性单元一起使用.如果我将persistence.xml从JTA更改为RESOURCE_LOCAL,则不必更改代码.
我尝试使用EntityManager.getTransaction()来查看是否存在活动事务,但是如果正在使用JTA,则调用getTransaction()会抛出异常.我可以使用try/catch包围对getTransaction()的调用,但我不想为此采用异常处理.EntityManager.getProperties()不显示任何指示JTA或RESOURCE_LOCAL的内容
我需要一些方法来告诉EntityManager(或EntityManagerFactory)在下面的代码中使用什么类型的持久性单元.
public class CredentialsUtil {
public static final String VGBD_PU = "VGDBpu";
static Logger logger = Logger.getLogger(CredentialsUtilStatic.class);
static EntityManagerFactory emf = Persistence.createEntityManagerFactory(VGBD_PU);
public static final String sharedKey="pgpsympwd";
public static String getPassword(String username) {
String selectStr = "select pgp_sym_decrypt(pgpsympassword, '" + sharedKey + "') from credentials where username='" + username + "'";
EntityManager em =null;
String password = "";
try {
em = emf.createEntityManager();
java.util.Map<java.lang.String,java.lang.Object> propMap = em.getProperties();
logger.info(propMap.keySet().size() + " properties");
for (String key : propMap.keySet())
logger.info(key + …Run Code Online (Sandbox Code Playgroud) 我刚刚设置了一个目前为止仍然非常小的项目maven/jpa/hibernate项目,我试图坚持一个对象.
我的课很简单:
@Entity
public class Person {
@Id @GeneratedValue
private int id;
private String name;
}
Run Code Online (Sandbox Code Playgroud)
我的persistence.xml也是非常基本的:
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0">
<persistence-unit name="Fahrplan_v2">
<class>model.Person</class>
<properties>
<property name="hibernate.connection.driver_class" value="org.hsqldb.jdbcDriver" />
<property name="hibernate.connection.url" value="jdbc:hsqldb:file:data/db/db" />
<property name="hibernate.connection.username" value="sa" />
<property name="hibernate.connection.password" value="" />
<property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect" />
<property name="hibernate.hbm2ddl.auto" value="update" />
</properties>
</persistence-unit>
</persistence>
Run Code Online (Sandbox Code Playgroud)
最后这是我用来持久保存对象的代码:
EntityManager em = entityManagerFactory.createEntityManager();
em.getTransaction().begin();
em.persist(person);
// em.flush(); <- does not effect outcome.
em.getTransaction().commit();
em.close();
Run Code Online (Sandbox Code Playgroud)
现在我希望在这里发生两件事:首先,我希望创建Person表(由于hibernate.hbm2ddl.auto = update).这已经发生了一次,它正确地写出来了
CREATE MEMORY TABLE PUBLIC.PERSON(
ID INTEGER GENERATED …Run Code Online (Sandbox Code Playgroud) 我有一个Login实体和一个Customer实体.Login.username是customer表中的外键.因此Java CustomerPOJO中的以下行
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "username", nullable = false)
private Login login;
Run Code Online (Sandbox Code Playgroud)
我的问题是:有没有一种简单的方法来查询customer表使用username?还是必须我第一次取login的username,然后customer用login?
这是JPA条件查询.而且,是的,我更愿意使用条件查询.
public Customer getCustomerByUsername(String username) throws EntityNotFoundException {
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<Customer> criteriaQuery = criteriaBuilder.createQuery(Customer.class);
Root<Customer> root = criteriaQuery.from(Customer.class);
Path<String> path = root.<String>get("username");
criteriaQuery.where(criteriaBuilder.equal(path, username));
return entityManager.createQuery(criteriaQuery).getSingleResult();
}
Run Code Online (Sandbox Code Playgroud)
这条线Path<String> path = root.<String>get("username")正在抛出一个例外username ... is not present.
我们有一个应用程序在服务器上使用Spring容器,它使用EJB3实体和Hibernate来持久保存PostgreSQL数据库中的数据.
我想使用单独的EntityManager将另一个连接添加到单独的数据库,但DBMS(Trifox Vortex)的供应商没有DataSource类型驱动程序.
Hibernate EntityManager可以使用简单的JDBC兼容驱动程序来实现实体的EJB3 JPA持久性吗?
我需要为我正在连接的DBMS使用特定的Hibernate Dialect吗?
对于它的价值,这里是我们当前的Spring实体管理器工厂的XML定义:
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitName" value="UniWorks-EntityPersistenceUnit"/>
<property name="dataSource" ref="dataSource"/>
<property name="jpaDialect">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect"/>
</property>
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="showSql" value="${db.showsql}"/>
<property name="generateDdl" value="${db.generate}"/>
<property name="databasePlatform" value="org.hibernate.dialect.PostgreSQLDialect"/>
</bean>
</property>
<property name="jpaProperties">
<props>
<prop key="hibernate.hbm2ddl.auto">${db.hbm2ddl}</prop>
</props>
</property>
</bean>
Run Code Online (Sandbox Code Playgroud)
更新/进展: 2013年3月21日
经过与供应商的多次交流后,我设法让他们的JDBC驱动程序使用简单的Java测试程序.
不幸的是,他们的JDBC驱动程序显然不足以让Hibernate获取足够的信息,因为Spring无法使用以下堆栈跟踪创建EntityManagerFactory:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in URL [bundle://222.0:0/META-INF/spring/cobol.xml]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: UniWorks-CobolPersistenceUnit] Unable to build EntityManagerFactory
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1455)[58:org.springframework.beans:3.1.1.RELEASE] …Run Code Online (Sandbox Code Playgroud) 这是我的ApplicationContext.xml的代码提示
<context:spring-configured />
<context:annotation-config />
<context:component-scan base-package="com.apsas.jpa" />
<tx:annotation-driven />
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
<property name="persistenceUnitName" value="testjpa" />
</bean>
<bean id="entityManager"
class="org.springframework.orm.jpa.support.SharedEntityManagerBean">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
Run Code Online (Sandbox Code Playgroud)
这是我的Dao实现
public class TeacherDaoImpl implements TeacherDao {
@Autowired
private EntityManager entityManager;
@Transactional
public Teacher addTeacher(Teacher teacher) {
entityManager.persist(teacher);
return teacher;
}
Run Code Online (Sandbox Code Playgroud)
}
这是我的主班
public class TestApp {
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
"config/ApplicationContext.xml");
TeacherDao teacherDao = new TeacherDaoImpl();
Teacher teacher1 = teacherDao.addTeacher(new Teacher("First Teacher"));
}
Run Code Online (Sandbox Code Playgroud)
} …
entitymanager ×10
jpa ×5
hibernate ×4
java ×3
doctrine-orm ×2
spring ×2
detach ×1
eclipselink ×1
ejb ×1
entity ×1
hsqldb ×1
jakarta-ee ×1
jdbc ×1
joincolumn ×1
jta ×1
junit ×1
php ×1
symfony ×1
unit-of-work ×1