【问题标题】:Table is not mapped表未映射
【发布时间】:2019-08-10 20:05:04
【问题描述】:

我在 Java 中的简单 servlet 方面需要帮助。 我在 HTML 文件中有一个登录表单(电子邮件和密码字段),一个 Java servlet 和一个用于在女巫中登录的实用程序,如果在 de 数据库中存在一对具有相同电子邮件和密码的人,则检查它。 运行程序我的查询出现语法错误,错误显示“用户未映射”。 我认为这是一个虚拟错误,有人可以帮助我吗?

这里是model.User类

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;

@Entity
@Table( name = "USERS",
        uniqueConstraints = {@UniqueConstraint(columnNames = {"email"})})

public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="user_id", nullable=false, unique=true)
    private int id;

    @Column(name="firstName", length=40, nullable=false)
    private String firstName;

    @Column(name="lastname", length=40, nullable=false)
    private String lastName;

    @Column(name="email", length=40, nullable=false)
    private String email;

    @Column(name="password", length=40, nullable=false)
    private String password;

    public User(String firstName, String lastName, String email, String password){
        this.firstName = firstName;
        this.lastName = lastName;
        this.email = email;
        this.password = password;
    }

    public int getId(){
        return this.id;
    }

    public void setId(int id){
        this.id = id;
    }

    public String getFirstName(){
        return this.firstName;
    }

    public void setFirstName(String firstName){
        this.firstName = firstName;
    }

    public String getLastName(){
        return this.lastName;
    }

    public void setLastName(String lastName){
        this.lastName = lastName;
    }

    public String getEmail(){
        return this.email;
    }

    public void setEmail(String email){
        this.email = email;
    }

    public String getPassword(){
        return this.password;
    }

    public void setPassword(String password){
        this.password = password;
    }
}

这里是utility.LoginDao 类

public static boolean validateCredentials(String email, String password){
        Session session = DbService.getSession();

        session.beginTransaction();

        Query query = session.createQuery
                ("from Users u where u.email=:email and u.password=:password");

        query.setParameter("email", email);
        query.setParameter("password", password);

        List list=query.list();
                ...

这里是我的 LoginServlet doPost() 方法:

protected void doPost(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {  
        String email = request.getParameter("email");  
        String password = request.getParameter("password");

        if(LoginDao.validateCredentials(email, password)){
            RequestDispatcher view = request.getRequestDispatcher("SigninSuccess.jsp");
            view.forward(request, response);
        }
        else{  
            RequestDispatcher rd=request.getRequestDispatcher("index.html");  
            rd.include(request,response);  
        }  
    }

这里是signin.html表单文件

<form method="POST" action="LoginServlet">
            <p>
                <label for="fname">E-mail</label>
                <input type="text" name="email" placeholder="e-mail">
            </p>
            <p>
                <label for="lname">Password</label>
                <input type="password" name="password" placeholder="password">
            </p>        
            <input type="submit" value="Login">
            <p class="message">Not registered? <a href="./signup.html">Create an account</a></p>
        </form>

这是错误:

用户未映射 [来自用户 u,其中 u.email=:email 和 p.password=:password] 在 org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:133) 在 org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:157) ...

【问题讨论】:

  • jquery 与问题有什么关系?
  • 当我在 HTML 表单中输入电子邮件和密码时,会调用 LoginServlet。
  • String email = request.getParameter("email"); String password = request.getParameter("password"); if(LoginDao.validateCredentials(email, password)){ RequestDispatcher view = request.getRequestDispatcher("SigninSuccess.jsp"); view.forward(request, response); } else{ out.print("Sorry username or password error"); RequestDispatcher rd=request.getRequestDispatcher("index.html"); rd.include(request,response); }

标签: java hibernate jpa servlets hql


【解决方案1】:

在这里,您正在使用数据库中的表名(用户)创建Query -

Query query = session.createQuery
                ("from Users u where u.email=:email and u.password=:password");

这就是您收到错误的原因。您需要使用实体名称 - User -

Query query = session.createQuery
                ("from User u where u.email=:email and u.password=:password");  

HQL 期望您使用 java 类名和 java 属性名。您还必须注意您使用的是javax.persistence.Entity 而不是org.hibernate.annotations.Entity

【讨论】:

  • 我在查询中使用了 - 用户 - 但我有同样的错误
  • @AntonioArgentieri 你能检查一下你的导入声明,Entity' you are importing? It need to be javax.persistence.Entity`
  • 是的,是同一个导入。
  • 我已经用完整的 User 类编辑了我的问题。
  • 您是否也在User 使用大写U - 它区分大小写。你也做过@componentScan 吗?
【解决方案2】:

Razib 给出了正确答案,告诉您在查询中使用User 而不是Users。如果你仍然遇到同样的错误,那只能是因为 Hibernate 没有找到 @Entity 类。

请运行以下代码并以输出响应。

sessionFactory.getConfiguration()
                .getClassMappings()
                .forEachRemaining(pc -> System.out.println(pc.getEntityName() + "\t" + pc.getTable().getName()));

提示:要获取sessionFactory,只需将其自动装配到服务或 dao 中:

@Autowired
private LocalSessionFactoryBean sessionFactory;

【讨论】:

  • 很抱歉,我读到“@Autowired”注释与 Spring 一起使用,但我使用 Hibernate 和 Postgresql
  • Postgres 与此无关,但可以肯定。如果你不使用 Spring,你可以直接使用 hibernate 配置对象。我上面的建议变成:配置 .getClassMappings() .forEachRemaining(pc -> System.out.println(pc.getEntityName() + "\t" + pc.getTable().getName()));
【解决方案3】:

终于解决了我的问题。我忘记在 LoginDao 类的配置中添加config.addAnnotatedClass(model.User.class);。谢谢大家。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 2020-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多