Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jpa Glassfish实体未持久化_Jpa_Glassfish_Ejb_Eclipselink_Jta - Fatal编程技术网

Jpa Glassfish实体未持久化

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

我在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 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是未翻转的