Jpa Glassfish实体未持久化
我在PostgreSQL中创建表和序列:Jpa Glassfish实体未持久化,jpa,glassfish,ejb,eclipselink,jta,Jpa,Glassfish,Ejb,Eclipselink,Jta,我在PostgreSQL中创建表和序列: CREATE SEQUENCE test_id INCREMENT 1 START 1 MAXVALUE 500; CREATE TABLE TEST( id NUMERIC PRIMARY KEY DEFAULT NEXTVAL('test_id'), name TEXT NOT NULL UNIQUE, name2 TEXT DEFA
CREATE SEQUENCE
test_id
INCREMENT 1
START 1
MAXVALUE 500;
CREATE TABLE TEST(
id NUMERIC PRIMARY KEY DEFAULT NEXTVAL('test_id'),
name TEXT NOT NULL UNIQUE,
name2 TEXT DEFAULT NULL
);
然后我在Eclipse中生成实体:
@Entity
@NamedQuery(name="Test.findAll", query="SELECT t FROM Test t")
public class Test implements Serializable {
private static final long serialVersionUID = 1L;
private long id;
private String name;
private String name2;
public Test() {
}
@Id
@SequenceGenerator(name="TEST_ID_GENERATOR", sequenceName="TEST_ID", allocationSize=1)
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="TEST_ID_GENERATOR")
public long getId() {
return this.id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public String getName2() {
return this.name2;
}
public void setName2(String name2) {
this.name2 = name2;
}
}
然后,我尝试从servlet在表中写入实体:
@PersistenceUnit(name="Tets")
EntityManagerFactory emf;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
EntityManager em = emf.createEntityManager();
Test t = new Test();
t.setName("jdsfjjd");
t.setName2("jdsfjjd");
em.persist(t);
response.getWriter().append("Served at: ").append(request.getContextPath());
}
当我部署项目并使用该servlet时,我看不到日志。项目是部署servlet是启动的,在浏览器中我看到:
服务于:/Tets
,但当我检查表时,我在那里没有看到我的实体。我做错了什么?简单的回答是:您误用了应用程序管理的EntityManager
在JavaEE环境中注入EntityManager时,它由IoC容器控制(它几乎总是EJB或CDI容器)。容器处理业务方法调用上的事务传播和划分,使得不需要对事务机制执行任何手动操作:
@PersistenceContext
private EntityManager em;
...
@TransactionAttribute(REQUIRES_NEW)
public void someMethod(Bean b) {
em.persist(b);
} // Transaction gets committed and em gets flushed with no extra work
当你注入一个EntityManagerFactory时,所有的魔力都消失了。在这种情况下,您需要手动执行事务绑定。你对此无所作为,这就是你得到TransactionRequiredException的原因。原始示例不抛出任何内容,因为如果没有活动事务,将不会进行刷新,因此您的更改将被静默忽略。这看起来是这样的:
@Resource
private UserTransaction t;
...
t.begin();
emf.createEntityManager().persist(bean);
t.commit();
在这个场景中,我建议您利用业界的最佳实践,将EntityManager注入与一些无状态bean结合使用,以维护EM的线程不安全性。然后将您的EJB注入这个servlet并执行您需要的操作
另一种方法是注入UserTransaction并显式调用它的begin()方法。UserTransaction没有声明为线程安全的,因此您需要围绕其使用进行某种同步。这肯定会破坏所有性能,因此我建议您回到第一个选项。在
em.persist(…)之后添加em.flush()
i add and catch javax.persistence.TransactionRequiredException:异常描述:此线程当前没有活动的外部管理事务。您必须配置事务管理器以获取帮助。但你是什么意思?我使用glassfish(payara)我不明白为什么当我对pk不使用generet策略时,实体是aded的,但当我使用sequence时,TrunsAction manager是未翻转的