我在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我也没有成功.在网上搜索此问题也没有出现类似案例和解决方案.
有没有人经历过类似的事情,并找到了解决方案?
我在过去构建了一些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?
我没有使用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) 在构造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) 我有@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的请求,我正在添加我用来引用注释的包:
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
如果我调用,连接仅返回到JPA应用程序中的连接池
entityManager.close();
Run Code Online (Sandbox Code Playgroud)
?
支持实体经理的连接在其生命周期中是否会发生变化?
感谢提前mojoo
java database-connection jpa connection-pooling 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) 我设法为我的电影插入工作人员 - 现在我想以正确的方式做到这一点.实体(缩写):
@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 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实体一次.
我正在使用:
在我们当前的应用程序(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?