如何在不希望在数据库中持久化的JPA实体bean中使用或注释虚拟字段
如何在不希望在数据库中持久化的JPA实体bean中使用或注释虚拟字段
我有一个用于登录验证的代码,使用一个Struts2 action类调用一个EJB进行LDAP验证,然后如果(LDAP凭据)验证成功,使用JPA实体bean查询用户数据库以获取其余的用户信息,该实体bean也充当了POJO。与用户名、用户ID和其他用户信息不同,密码不存储在数据库中,但为了POJO的getter和setter方法,我尝试包含一个虚拟密码字段 - 用于服务于Struts2 action表单。
问题是,在LDAP认证后,出现一个异常,指出数据库中不存在“password”列(本来也没有意义!)
异常[EclipseLink-4002](Eclipse Persistence Services - 2.0.1.v20100213-r6600):org.eclipse.persistence.exceptions.DatabaseException 内部异常:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:在“字段列表”中未知列'PASSWORD' 错误代码:1054 Call: SELECT PERSON_ID, ACTIVE_USER, EMAIL, FIRSTNAME, SURNAME, PASSWORD, FULLNAME, EMPLOYEE_NUMBER FROM xxte_employees WHERE (ACTIVE_USER = ?) 绑定 => [john.doe] Query: ReadAllQuery(name="XxteEmployees.validateLogin" referenceClass=XxteEmployees sql="SELECT PERSON_ID, ACTIVE_USER, EMAIL, FIRSTNAME, SURNAME, PASSWORD, FULLNAME, EMPLOYEE_NUMBER FROM xxte_employees WHERE (ACTIVE_USER = ?)") at org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:333) at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:687) at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeCall(DatabaseAccessor.java:530) at org.eclipse.persistence.sessions.server.ServerSession.executeCall(ServerSession.java:529) ....
以下是实体bean的代码:
public class XxteEmployees implements Serializable { private static final long serialVersionUID = 1L; @Column(name = "ACTIVE_USER") private String activeUser; @Column(name = "EMAIL") private String email; @Id @Basic(optional = false) @Column(name = "PERSON_ID") private Double personId; @Column(name = "EMPLOYEE_NUMBER") private Double employeeNumber; @Column(name = "FIRSTNAME") private String firstname; @Column(name = "SURNAME") private String surname; private String fullname; private String password; public XxteEmployees() { } public XxteEmployees(Double personId) { this.personId = personId; } public String getActiveUser() { return activeUser; } public void setActiveUser(String activeUser) { this.activeUser = activeUser; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public Double getPersonId() { return personId; } public void setPersonId(Double personId) { this.personId = personId; } public Double getEmployeeNumber() { return employeeNumber; } public void setEmployeeNumber(Double employeeNumber) { this.employeeNumber = employeeNumber; } public String getFirstname() { return firstname; } public void setFirstname(String firstname) { this.firstname = firstname; } public String getSurname() { return surname; } public void setSurname(String surname) { this.surname = surname; } // BEGIN: objects not in db public String getFullname() { return firstname + ' ' + surname; } public void setFullname(String fullname) { this.fullname = firstname + ' ' + surname;; } public String getPassword() { return sifre; } public void setPassword(String password) { this.password = password; } // END: objects not in db
有什么解决办法吗?