标签: entitymanager

WELD-001408注入EntityManager时不满意的依赖关系

我有@Statelessbean实现两个接口(远程和本地).我还添加@LocalBean了用于通过无接口视图访问bean的anotation.

@Stateless
@LocalBean
public class WeatherDataBean implements WeatherDataBeanRemote, WeatherDataBeanLocal {
    @Inject
    private EntityManager entityManager;

    public WeatherDataBean () {

    }
    // ....attributes, getter & setter methods ....
}
Run Code Online (Sandbox Code Playgroud)

我使用@Inject这个原因取自JBoss AS7快速启动的这个例子:

我们使用来自CDI的"资源生成器"模式,将实体管理器的旧式@PersistenceContext注入"别名"为CDI样式注入.这允许我们在整个应用程序中使用一致的注入样式(@Inject).

以前我用过:

@PersistenceContext(unitName="WeatherStationJPA")
private EntityManager entityManager;
Run Code Online (Sandbox Code Playgroud)

在EJB中,它没有任何问题.但是使用@Inject注释我得到这个错误:

WELD-001408在注入点[[field] @Inject private ejb.WeatherDataBean.entityManager]中带有限定符[@Default]的[EntityManager]类型的不满意依赖项

这是我如何定义类资源:

public class Resources {
     @SuppressWarnings("unused")
     @PersistenceContext(unitName="WeatherStationJPA")
     @Produces
     private EntityManager entityManager;

     @Produces
     FacesContext getFacesContext() {
         return FacesContext.getCurrentInstance();
     }
}
Run Code Online (Sandbox Code Playgroud)

如果我尝试注入实体管理器,为什么会出现此错误?

编辑: 根据@LightGuard的请求,我正在添加我用来引用注释的包:

  1. WeatherDataBean有:

    import javax.ejb.LocalBean;
    import javax.ejb.Stateless;
    import javax.inject.Inject; …
    Run Code Online (Sandbox Code Playgroud)

dependency-injection stateless-session-bean entitymanager cdi java-ee-6

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

ZF2和EntityManager(主义)

我有个问题.我尝试在没有控制器的情况下获得Entity-Manager,但我没有找到办法.这时,我得到了这样的Entity-Manager:

(Controller)
public function getEntityManager()
{
    if (null === $this->_em) {
        $this->_em = $this->getServiceLocator()->get('Doctrine\ORM\EntityManager');
    }
    return $this->_em;
}

(Plugin)
public function getEntityManager()
{
    if($this->_em == null){
        $this->_em = $this->getController()->getServiceLocator()->get('doctrine.entitymanager.orm_default');
    }
    return $this->_em;
}
Run Code Online (Sandbox Code Playgroud)

你看,我总是需要一个控制器.但是,如果我需要模型中的EntityManager,我有一个问题.我可以给模型控制器,但我认为这是一个糟糕的方式.

您是否有任何想法在没有控制器的情况下获取EntityManager?

doctrine entitymanager zend-framework2

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

当使用EntityManager的createQuery()和find()方法时?

我想知道这些方法之间的区别.

当使用EntityManager 的createQuery()find()方法时?

他们每个人的优势是什么?

谢谢你的回答.

java jpa entitymanager

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

使用EntityManager替换实体的最佳方法

我正在使用JPA EntityManager来执行某些操作,并且一个此类操作正在将实体替换为具有相同实体的另一个实体@Id.那么,给定一个oldObject和一个newObject,什么是最好的方法来删除oldObject并替换它newObject

这里有一些不起作用的代码:

try
{
    entityManager.getTransaction().begin();
    entityManager.remove(oldObject);
    entityManager.persist(newObject);
    entityManager.getTransaction().commit();
}
catch (PersistenceException persistExc)
{
    entityManager.getTransaction().rollback();
    // do some stuff
}
Run Code Online (Sandbox Code Playgroud)

此代码获得以下异常:

javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist: com.depressio.SomeObject
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1215)
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1148)
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1154)
    at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:678)
Run Code Online (Sandbox Code Playgroud)

现在,它当然可行,如果不是删除实体,我只是更新其已更改的字段.但是,我只是被赋予了新的对象(UI通过REST将它扔给我),所以我真的不知道哪些字段已经改变,所以我必须更新每个字段.如果有大量的田地,那就不理想了.

我觉得我对如何正确删除有点困惑.我认为EntityManager.remove是正确的方式,但我猜不是.

提前致谢!

编辑1:我觉得我应该注意oldObject.id == newObject.id.在id通过产生@SequenceGenerator.如果标识符已经用生成器注释,我是否可以使用标识符来持久保存对象?

编辑2:根据这里最热门的答案,因为@Id已经定义了它并且它是一个自动生成的字段,Hibernate认为它已经分离了.现在我知道为什么我会得到例外,但解决方案仍然不清楚.

hibernate jpa entitymanager

7
推荐指数
1
解决办法
3860
查看次数

Spring Transactional Annotation

我正在努力更好地处理Spring的@Transactional属性.据我所知,它基本上包装了标记为@Transactional事务的方法的内容.将服务/业务层方法标记为事务性是否合适,而不是实际的DAO方法,就像我在这里所做的那样?

服务实施

public class UserServiceImpl implements UserServiceInt{
   @Autowired
   private UserServiceDAO serviceDAO;


   @Override
   public User getUser(int id){
      return serviceDAO.getUser(id);
   }

   @Override
   @Transactional
   public void updateUserFirstName(int id, String firstName) throws SomeException{
      User userToUpdate = getUser(id);
      if(userToUpdate == null){
         throw new SomeException("User does not exist");
      }
      userToUpdate.setFirstName(firstName);
      serviceDAO.updateUser(userToUpdate);
   }

}
Run Code Online (Sandbox Code Playgroud)

DAO实施

public class UserServiceDAOImpl implements UserServiceDAOInt{
   @PersistenceContext(unitName="myUnit")
   private EntityManager entityManager;

   @Override
   public void updateUser(User user){
      entityManager.merge(user);
   }

}
Run Code Online (Sandbox Code Playgroud)

我甚至不确定是否需要合并调用.Spring如何知道要使用哪个EntityManager,因为UserServiceImpl类中没有EntityManager声明?

java spring transactions spring-mvc entitymanager

7
推荐指数
1
解决办法
844
查看次数

如何在Spring Roo中使用JUnit测试?(EntityManager的问题)

我正在尝试为Spring Roo项目编写JUnit测试.如果我的测试需要使用实体类,我会得到以下异常:

java.lang.IllegalStateException: Entity manager has not been injected 
(is the Spring Aspects JAR configured as an AJC/AJDT aspects library?)
Run Code Online (Sandbox Code Playgroud)

Spring Aspects JAR看起来配置正确.特别是,我在pom.xml文件中有以下内容:

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-aspects</artifactId>
  <version>${spring.version}</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

<plugin>
  <configuration>
  <outxml>true</outxml>
  <aspectLibraries>
    <aspectLibrary>
      <groupId>org.springframework</groupId>
        <artifactId>spring-aspects</artifactId>
    </aspectLibrary>
  </aspectLibraries>
  <source>1.6</source>
  <target>1.6</target>
  </configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)

当没有从JUnit测试调用时,使用实体类的类工作正常.知道如何设置,以便从JUnit测试中注入实体管理器吗?

这是我的Test类(或多或少):

public class ServiceExampleTest {

  @Test
  public void testFoo() {
    FooService fs = new FooServiceImpl();
    Set<Foo> foos = fs.getFoos();
  }
}
Run Code Online (Sandbox Code Playgroud)

这足以抛出异常.FooServiceImpl类返回一个Foo,其中Foo是一个实体类.该getFoos()应用程序时,通常的方式运行方法的工作.问题只出在单元测试的背景下.

java junit entitymanager spring-roo

6
推荐指数
2
解决办法
7075
查看次数

如何从Entity Manager获取jpa数据源属性

大家好

我想知道是否可以通过实体管理器获取数据库连接属性.

我的persistence.xml看起来像这样

<persistence ...>
     <persistence-unit name="default" transaction-type="JTA">
          <jta-data-source>DatasourceForTestSystem</jta-data-source>
          <class> some.package.and.some.Class </class>
          ...
     </persistence-unit>
</persistence>
Run Code Online (Sandbox Code Playgroud)

我想要类似的东西

String host = em.getSomeFunction().getProperties().get("server");
String database = em.getSomeFunction().getProperties().get("database");
or
String url = em.getSomeFunction().getConnectionPool().getURL();
Run Code Online (Sandbox Code Playgroud)

url是什么样的jdbc:oracle:thin:@1.2.3.4:5678:database.我正在使用带有EclipseLink的JDeveloper 12c,一个Oracle数据库和NO Hibernate.

有人知道如何获取有关连接属性的信息吗?

亲切的问候,

STEFI

- 更新 -

@Kostja:再次请求你的帮助,但正如我在帖子中提到的,我根本不使用Hibernate.

我已经尝试过像这样使用Connection.class了

java.sql.Connection conn = em.unwrap(java.sql.Connection.class);
Run Code Online (Sandbox Code Playgroud)

这里开始.我总是在这个语句中为Connection和getSession()提供NPE

((JNDIConnector)em.unwrap(JpaEntityManager.class)
    .getSession().getLogin().getConnector()).getName();
Run Code Online (Sandbox Code Playgroud)

这里开始.

我很安静,为什么这些解决方案对我有用.也许我错过了什么:-(

java jpa jta entitymanager

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

苦苦挣扎,了解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
查看次数

在EntityManager查询上设置超时

我目前正从EntityManager查询中获取连接超时错误.是否可以为这些设置超时?

persistence.xml中

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" 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">
  <persistence-unit name="CallPU" transaction-type="RESOURCE_LOCAL">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <class>call.structure.Task</class>
    <class>call.structure.Installation</class>
    <class>call.structure.Contents</class>
    <class>call.structure.Recipient</class>
    <class>call.structure.CallTask</class>
    <class>call.structure.SmsTask</class>
    <class>call.structure.EmailTask</class>
    <class>call.security.User</class>
    <class>call.structure.content.Content</class>
    <class>call.structure.content.RecordContent</class>
    <class>call.structure.content.WaitContent</class>
    <class>call.structure.content.TextContent</class>
    <class>call.structure.content.VariableContent</class>
    <class>call.structure.content.SoundContent</class>
    <class>call.structure.content.SubjectContent</class>
    <class>call.structure.content.FileContent</class>
    <class>call.structure.Bounce</class>
    <properties>
      <property name="javax.persistence.jdbc.url" value="jdbc:oracle:thin:@127.0.0.1:1521:TEST"/>
      <property name="javax.persistence.jdbc.password" value="userpassword"/>
      <property name="javax.persistence.jdbc.driver" value="oracle.jdbc.OracleDriver"/>
      <property name="javax.persistence.jdbc.user" value="username"/>
    </properties>
   </persistence-unit>
</persistence>
Run Code Online (Sandbox Code Playgroud)

代码在我的线程的run函数中超时:

private class TaskDB extends Thread {

    private final long WAITING_TIME = 20000L;

    @Override
    public void run() {

        Set<SmsTask> remove = SMSManager.this.getRemoveTask();
        Set<SmsTask> normal = SMSManager.this.getNormalTask();

        try {
            while(true){
                EntityManager em = …
Run Code Online (Sandbox Code Playgroud)

java hibernate timeout jpa entitymanager

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

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

我正在制作一个数据库迁移工具,并且正在处理一个非常笨拙的源数据库。它基本上是一张具有 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
查看次数