标签: entitymanager

如何在 JUnit 测试中初始化 EJB 的 EntityManager?

我正在尝试为具有注入的 EntityManager 的无状态会话 bean 编写 JUnit 测试:

@Stateless
public class MyServiceBean implements MyService, ... {
@PersistenceContext
    private EntityManager em;
    ....
Run Code Online (Sandbox Code Playgroud)

当然,如果不做任何事情,em在测试流程中仍然为空......

测试应该独立运行(而不是在 Java EE 容器中)。

请问我该怎么做?(简单的解决方案将受到高度赞赏:-)

junit hibernate ejb entitymanager

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

苦苦挣扎,了解EntityManager的正确使用方法

我正在开始一个新项目,我对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直到我理解它为止.谢谢 :)

hibernate jpa entitymanager

6
推荐指数
1
解决办法
3314
查看次数

使用 EntityManagerDecorator 扩展 Doctrine EntityManager 在 UnitOfWork 中留下错误的引用

我想延长EntityManager使用的原则EntityManagerDecorator,并与参考基地遇到了问题EntityManagerUnitOfWork传递到存在prePersist通过事件$eventArgs

它看起来像EntityManager被传递到UnitOfWorkEntityManager::__construct的时候UnitOfWork被创建。

我想到了一个解决方案可能是,我可以替代默认UnitOfWorkMyEntityManagerDecorator::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)

php entitymanager symfony doctrine-orm

6
推荐指数
1
解决办法
2825
查看次数

如何在 Doctrine 中附加分离的实体?

我有一个脚本将循环中的一些“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)

entity unit-of-work entitymanager detach doctrine-orm

6
推荐指数
1
解决办法
4287
查看次数

我可以有一个仅映射到表的某些列的实体吗?

我正在制作一个数据库迁移工具,并且正在处理一个非常笨拙的源数据库。它基本上是一张具有 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 会标记不应保留的字段。但我想做相反的事情,忽略数据库列,只将表部分映射到类。

java jpa entitymanager eclipselink jakarta-ee

6
推荐指数
1
解决办法
5135
查看次数

如何判断我的EntityManager是使用JTA还是RESOURCE_LOCAL数据源?

我有一个实用程序类,如下所示.我希望能够将此类与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)

jpa jta entitymanager

5
推荐指数
1
解决办法
1623
查看次数

EntityManager不会写入数据库

我刚刚设置了一个目前为止仍然非常小的项目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)

hibernate jpa hsqldb entitymanager

5
推荐指数
1
解决办法
6386
查看次数

EntityManager通过joinColumn查询

我有一个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?还是必须我第一次取loginusername,然后customerlogin

这是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.

java jpa entitymanager joincolumn

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

Spring/JPA/Hibernate可以使用简单的JDBC兼容驱动程序吗?

我们有一个应用程序在服务器上使用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)

java spring hibernate jdbc entitymanager

5
推荐指数
1
解决办法
1938
查看次数

使用Spring注入EntityManager(空指针异常)

这是我的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)

} …

spring entitymanager

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