使用实体管理器本地查询插入JPA



我试图在我的数据库中插入数据,我在我的项目中使用JPA。

这是我的豆子的样子。

@PersistenceContext
EntityManager em;
    em.createNativeQuery("INSERT INTO testtable ('column1','column2') VALUES ('test1','test2')").executeUpdate();

myfacade:

@Stateless
public class TestFacade extends AbstractFacade<Test> {
    @PersistenceContext(unitName = "TEST2PU")
    private EntityManager em;
    @Override
    protected EntityManager getEntityManager() {
        return em;
    }
    public TestFacade() {
        super(Test.class);
    }

i get a error:

javax.persistence.TransactionRequiredException: executeUpdate is not supported for a Query object obtained through non-transactional access of a container-managed transactional EntityManager

如果我不使用@PersistenceContext for EntityManager

EntityManagerFactory emf = Persistence.createEntityManagerFactory("TEST2PU");
EntityManager em = emf.createEntityManager();
em.createNativeQuery("INSERT INTO testtable ('column1','column2') VALUES ('test1','test2')").executeUpdate();

这是我的错误:

javax.persistence.TransactionRequiredException: 
Exception Description: No externally managed transaction is currently active for this thread

可以使用NativeQuery和它的executeUpdate方法:

String query = "insert into Employee values(1,?)";
em.createNativeQuery(query)
   .setParameter(1, "Tom")
   .executeUpdate();

我也有同样的问题。

EntityManager em = getEntityManager();
EntityTransaction et = em.getTransaction();
et.begin();
em.createNativeQuery("UPDATE ... ;").executeUpdate();
et.commit();

您可以使用createNativeQuery编写特定于数据库语言的查询。

String query = "INSERT INTO userinfo ( login, upassword, email, mobile, fax, dob)"
             + " VALUES ( :a, :b, :c, :d, :e, :f)"
em.createNativeQuery(query)
    .setParameter("a", objUser.getLogin())
    .setParameter("b", objUser.getUpassword())
    .setParameter("c", objUser.getEmail())
    .setParameter("d", objUser.getMobile())
    .setParameter("e", objUser.getFax())
    .setParameter("f", objUser.getDob())
    .executeUpdate();

假设您正在使用容器管理的entityManager(注入@PersistenceContext),您只是错过了TestFacade方法上方的@Transactionnal注释。

String query = "SELECT * FROM daily_clouser_report_summery b "
                + "WHERE operatorId='" + operatorId + "' AND "
                + "STR_TO_DATE(b.repDate, '%d-%m-%Y')"
                + "BETWEEN STR_TO_DATE('" + formattedDates + "', '%d-%m-%Y') AND STR_TO_DATE('" + formattedDates + "', '%d-%m-%Y');";
        SessionFactory sf = this.hibernateTemplate.getSessionFactory();
        EntityManager em = sf.createEntityManager();
        List<DailyClouserReportSummery> list = em.createNativeQuery(query, DailyClouserReportSummery.class).getResultList();
        return list;

最新更新