如何使用实体管理器使用查询将值插入数据库,使用java类进行持久化?

时间:2011-02-11 10:19:20

标签: java jpa java-ee

我想使用以下代码将数据插入表中

    public User registerUser(String usr, String pwd) {

    u=em.find(User.class,usr);
    if(u!=null)
    {
        return null;
    }
    String query1 = "insert into users values('" + usr + "','" + pwd +"')";
    Query q = em.createQuery(query1);
    u=em.find(User.class,usr);
    return u;

}

此处'u'是User类的对象,emEntityManager

我得到以下异常:

  

servlet操作的Servlet.service()引发了异常   org.hibernate.hql.ast.QuerySyntaxException:期待OPEN,在第1行第19列附近找到'values'[插入用户值('pawan','am')]

3 个答案:

答案 0 :(得分:16)

尝试

public User registerUser(String usr, String pwd) {

    u=em.find(User.class,usr);
    if(u!=null)
    {
        return null;
    }

    //Now saving...
    em.getTransaction().begin();
    em.persist(u); //em.merge(u); for updates
    em.getTransaction().commit();
    em.close();

    return u;
}

如果PK是Identity,如果您使用自动生成策略,它将自动设置在您的持久化类中(感谢David Victor)。

编辑@aman_novice评论: 在课堂上设置

//Do this BEFORE getTransaction/persist/commit
//Set names are just a example, change it to your class setters
u.setUsr(usr);
u.setPwd(pwd);

//Now you can persist or merge it, as i said in the first example
em.getTransaction().begin();
(...)

关于@David Victor,抱歉,我忘记了这一点。

答案 1 :(得分:5)

你没有使用SQL而是使用JPAQL,没有基于字段的插入。您持久化对象而不是插入行。

你应该这样做:

public User registerUser(String usr, String pwd) {
    u=em.find(User.class,usr);
    if(u!=null)
    {
        return u;
    }
    u = new User(usr, pwd);
    em.persist(u);
    return u;
}

答案 2 :(得分:0)

这不是真正的方法。您正尝试在表中插入一行但没有关联的附加实体。如果您正在使用JPA实体管理器 - 然后创建一个新实例 - 设置属性&坚持实体。

E.g。

User u = new User();
u.setXXX(xx);

em.persist(u);
// em.flush()   <<-- Not required, useful for seeing what is happening

// etc..

如果在Hibernate&amp;中启用SQL loggging。刷新实体,然后您将看到发送到数据库的内容。

E.g。在persistence.xml中:

    <property name="hibernate.format_sql" value="true" />