标签: entitymanager

EntityManager在JBoss JSF bean的merge()上抛出TransactionRequiredException

我在JBoss 5.0.1GA上设置了一个JSF应用程序,在表格中显示用户列表,并允许通过每个用户旁边的按钮删除单个用户.

当调用deleteUser时,调用将传递给UserDAOBean,后者从JBoss注入一个EntityManager.

我正在使用代码

public void delete(E entity)
{
    em.remove(em.merge(entity));
}
Run Code Online (Sandbox Code Playgroud)

删除用户(代码是JPA教程中的c&p).只是调用em.remove(实体)没有任何效果,仍会导致相同的异常.

到达这一行时,我得到一个TransactionRequiredException:

(跳过显然不相关的堆栈跟踪)

...

20:38:06,406错误[[Faces Servlet]] servlet的Servlet.service()Faces Servlet抛出异常javax.persistence.TransactionRequiredException:EntityManager必须在org.jboss.jpa.deployment.ManagedEntityManagerFactory.verifyInTx(ManagedEntityManagerFactory)的事务中访问.java:155)atg.jboss.jpa.tx.TransactionScopedEntityManager.merge(TransactionScopedEntityManager.java:192)位于at.fhj.itm的at.fhj.itm.utils.DAOImplTemplate.delete(DAOImplTemplate.java:54). Sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)中的UserBean.delete(UserBean.java:53)

...

我已经尝试在它周围包装一个手动管理的事务(em.getTransaction().begin()+ .commit()),但这失败了,因为它不允许在JBoss容器中.UserTransaction我也没有成功.在网上搜索此问题也没有出现类似案例和解决方案.

有没有人经历过类似的事情,并找到了解决方案?

java jsf jboss jpa entitymanager

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

JPA EntityManager静态或实例?

我在过去构建了一些JPA的东西,它们使用了javax.persistence.EntityManager每个DAO实例的一个实例; 这是大多数示例的设置方式.

public class BaseDaoThatEveryDaoExtends {
   @PersistenceContext
   private EntityManager entityManager;
}
Run Code Online (Sandbox Code Playgroud)

我只是偶然发现使用注释注入的静态 代码,架构师告诉我这不会引起任何问题,即使在具有JTA和XA数据源的集群应用程序中也没有任何问题:javax.peristence.EntityMangerPersistenceContext

public class BaseDaoThatEveryDaoExtends {
   @PersistenceContext
   private static EntityManager entityManager;
}
Run Code Online (Sandbox Code Playgroud)

据我所知,这是一个反模式,因为它EntityManager保存一些状态信息并使其静态使整个状态应用程序广泛.这也使得课程很难测试.

这样做有其他缺点还是这是使用标准的方法EntityManager

java hibernate jpa entitymanager

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

Hibernate EntityManager,它应该被用作单例吗?

我没有使用Spring,所以我在一个类中创建一个EntityManager实例.

我使用Hibernate-Eclipse逆向工程来自动生成类.这些类都有一个EntityManager实例.

我不是100%确定Hibernate如何与EntityManager一起工作,所以我想知道这个类(EntityManager)的这么多实例是否可以,例如,交易会出现问题吗?

我是否应该创建一个单独的类来为所有其他类分发EntityManager的静态实例?或者没关系?

编辑:我看到有一些名为@PersistenceContext的东西,它似乎没有将我的persistence.xml作为bean加载到实例变量中,这个功能是否需要spring?(我得到空指针异常,因为它从未被注入)

从我尝试使用@persistencecontext的代码片段

@PersistenceContext(unitName = "manager1")
private EntityManager entityManager;
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="manager1" transaction-type="RESOURCE_LOCAL">
         <provider>org.hibernate.ejb.HibernatePersistence</provider>

      <properties>

         <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
         <property name="javax.persistence.jdbc.user" value="root"/>
         <property name="javax.persistence.jdbc.password" value="mypassword"/>
         <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost/ptbrowserdb"/>
         <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
      </properties>
   </persistence-unit>
</persistence>
Run Code Online (Sandbox Code Playgroud)

java spring hibernate entitymanager

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

EJB:在PostConstruct方法中使用EntityManager

在构造bean之后,我想使用EntityManager从数据库中检索数据.在构造函数中是不可能的,因为在调用构造函数之后注入EntityManager.所以我尝试在用@PostConstruct注释的方法中做到这一点.根据API,在完成所有注入后调用PostConstruct方法.执行查询有效,但它总是返回一个空列表.如果我在其他方法中使用相同的查询,则返回正确的结果.有谁知道,为什么它在PostConstruct方法中不起作用?

@Stateful(mappedName = "price")
@Singleton
@Startup
public class PriceManagementBean implements PriceManagement {

    @PersistenceContext
    private EntityManager em;

    private List<PriceStep> priceSteps =  Collections.synchronizedList(new ArrayList<PriceStep>());


    public PriceManagementBean(){


    }


    @PostConstruct
    public void init(){
        javax.persistence.Query query = em.createQuery("SELECT ps FROM PriceStep ps");
        List<PriceStep> res = query.getResultList();
            .....
       }
}
Run Code Online (Sandbox Code Playgroud)

java ejb entitymanager

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

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万
查看次数

什么时候连接返回到JPA应用程序中的连接池?

如果我调用,连接仅返回到JPA应用程序中的连接池

entityManager.close();
Run Code Online (Sandbox Code Playgroud)

支持实体经理的连接在其生命周期中是否会发生变化?

感谢提前mojoo

java database-connection jpa connection-pooling entitymanager

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

为什么EntityManager为空?

在我的Web应用程序中,我在Apache Tomcat(TomEE)/7.0.37服务器上使用OpenJPA.我使用Netbeans自动生成类("实体类来自数据库......"和"会话Bean来自实体类......").在SessionBean(例如UserFacade)我想获得EntityManager:

@Stateless
public class UserFacade extends AbstractFacade<User> {
  @PersistenceContext(unitName = "CollDocPU")
  private EntityManager em;

  @Override
  protected EntityManager getEntityManager() {
    return em;
  }
}
Run Code Online (Sandbox Code Playgroud)

但是当我通过上面的方式得到它时,我得到了null.当我通过:

@Override
protected EntityManager getEntityManager() {
    EntityManagerFactory emf = Persistence.createEntityManagerFactory("CollDocPU");
    EntityManager ecm = emf.createEntityManager(); 
    return ecm;
}    
Run Code Online (Sandbox Code Playgroud)

ecm不是null,没关系

我的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="CollDocPU" transaction-type="RESOURCE_LOCAL">
<provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
<class>model.entity.StudentAddSolution</class>
<class>model.entity.Lecturer</class>
<class>model.entity.Solution</class>
<class>model.entity.Student</class>
<class>model.entity.Course</class>
<class>model.entity.File</class>
<class>model.entity.CourseHasLecturer</class> 
<class>model.entity.Mail</class>
<class>model.entity.StudentAtCourse</class>
<class>model.entity.Roles</class>
<class>model.entity.Task</class>
<class>model.entity.User</class>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
   <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:11080/myBase?zeroDateTimeBehavior=convertToNull"/>
   <property name="javax.persistence.jdbc.password" value="pass,"/>
   <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
   <property …
Run Code Online (Sandbox Code Playgroud)

java entitymanager openjpa persistence.xml tomee

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

JPA - 插入连接表的正确方法(带有额外的列)

我设法为我的电影插入工作人员 - 现在我想以正确的方式做到这一点.实体(缩写):

@Entity
@Table(name = "movies")
public class Movie implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int idmovie;
    // bi-directional many-to-one association to MoviesHasCrew
    @OneToMany(mappedBy = "movy", cascade = CascadeType.PERSIST)
    private List<MoviesHasCrew> moviesHasCrews;
}

@Entity
@Table(name = "movies_has_crew")
public class MoviesHasCrew implements Serializable {
    @EmbeddedId
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private MoviesHasCrewPK id;
    // bi-directional many-to-one association to Crew
    @ManyToOne
    @JoinColumn(name = "crew_idcrew", columnDefinition = "idcrew")
    @MapsId("crewIdcrew")
    private Crew crew;
    // bi-directional many-to-one association to Movy
    @ManyToOne
    @JoinColumn(name = "movies_idmovie") …
Run Code Online (Sandbox Code Playgroud)

jpa entitymanager eclipselink jpa-2.0

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

JPA 2.1实体图表返回重复的结果

我开始在JPA 2.1中使用新的实体图形功能来指定必须加载的Lazy集合.考虑以下课程:

@Entity
@NamedQueries({
    @NamedQuery(name="findWithFilterAttr","select a from A a where a.filterAttribute like :filter")
})
@NamedEntityGraphs({
@NamedEntityGraph(name = "graph.childs", attributeNodes = @NamedAttributeNode("childs"))})
public class A{
  @Id
  private long id;
  @OneToMany(mappedBy="parent")
  private List<B> childs;
  private String filterAttribute;
}
@Entity
public class B{ 
  @Id
  private long id;
  @ManyToOne
  private A parent;
}
Run Code Online (Sandbox Code Playgroud)

当我执行命名查询以获取具有实体图形提示的A实体列表时,我得到一个带有重复A实体的集合.如何只加载A实体一次.

我正在使用:

  • Hibernate 4.3.5
  • Wildfly 8.1

hibernate jpa entitymanager java-ee wildfly

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

从hibernate配置创建EntityManagerFactory

在我们当前的应用程序(Java SE)中,我们使用Hibernate特定的API,但我们希望尽可能(但慢慢地)迁移到JPA.为此,我需要EntityManagerFactory而不是SessionFactory(我想保持这个公理没有争议).

问题出在哪里,目前我们的会话工厂正在创建org.hibernate.cfg.Configuration,我想暂时保留它 - 因为这个配置通过我们软件的不同部分传递,可以并且可以根据需要配置持久性.

所以问题是:我该怎么做

ServiceRegistry serviceRegistry = new ServiceRegistryBuilder()
                                   .applySettings( hibConfiguration.getProperties() )
                                   .buildServiceRegistry();
SessionFactory sessionFactory = hibConfiguration.buildSessionFactory( serviceRegistry );
Run Code Online (Sandbox Code Playgroud)

相当于导致EntityManagerFactory

java hibernate jpa sessionfactory entitymanager

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