2012-12-12 13 views
0

在我的用户登录程序中遇到了一个奇怪的场景。OPEN JPA find()无法从我的数据库检索实体的值

  1. 插入记录..用户标识密码等
  2. 使用合并()插入记录;
  3. 然后关闭IDE(Netbeans)
  4. 打开IDE Netbeans然后启动服务器,启动数据库连接。
  5. 打开登录浏览器。
  6. 使用插入的记录登录。
  7. 我的程序无法检测到桌面上的记录。

调试时,在find()之后它不会填充我的实体..也许还有一个步骤来填充实体?

的LoginAction

package lotmovement.action; 

import com.opensymphony.xwork2.ActionSupport; 
import lotmovement.business.crud.RecordExistUserProfile; 
import org.apache.commons.lang3.StringUtils; 


public class LoginAction extends ActionSupport{ 

    private String userName; 
    private RecordExistUserProfile recordExistUserProfile; 


    private String password; 

    @Override 
    public void validate(){ 

     if(StringUtils.isEmpty(getUserName())){ 
      addFieldError("userName","Username must not be blanks."); 

       } 

     else{ 

      if(!recordExistUserProfile.checkrecordexist(getUserName())){ 
       addFieldError("userName","Username don't exist."); 
      } 



     }   



     if(StringUtils.isEmpty(getPassword())){ 
      addFieldError("password","Password must not be blanks."); 
     } 
     else{ 

     if(!recordExistUserProfile.CheckPasswordCorrect(getUserName(), getPassword())){ 
       addFieldError("userName","Password not correct"); 
      } 


     } 



    } 


    public String execute(){ 

     return SUCCESS; 
    } 


    public String getPassword() { 
     return password; 
    } 

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

     public String getUserName() { 
     return userName; 
    } 

    public void setUserName(String userName) { 
     this.userName = userName; 
    } 



    public RecordExistUserProfile getRecordExistUserProfile() { 
     return recordExistUserProfile; 
    } 

    public void setRecordExistUserProfile(RecordExistUserProfile recordExistUserProfile) { 
     this.recordExistUserProfile = recordExistUserProfile; 
    } 




} 

验证计划

/* * 要改变这个模板,选择Tools |模板 *并在编辑器中打开模板。 */ 包lotmovement.business.crud;

import lotmovement.business.entity.UserProfile;

/** * * @author神gavedmework */ 公共类RecordExistUserProfile {

private EntityStart entityStart; 
private UserProfile userProfile; 


public boolean checkrecordexist(String userId) { 
    entityStart.StartDbaseConnection(); 
    entityStart.em.find(UserProfile.class, userId); 

    if (userId.equals(userProfile.getUserId())) { 
     return true; 
    } else { 
     return false; 
    } 
} 

public boolean CheckPasswordCorrect(String userId, String password) { 
    entityStart.StartDbaseConnection(); 

    entityStart.em.find(UserProfile.class, userId); 

    if (password.equals(userProfile.getPassword())) { 
     return true; 
    } else { 
     return false; ---> It will step here. 
    } 

} 



public UserProfile getUserProfile() { 
    return userProfile; 
} 

public void setUserProfile(UserProfile userProfile) { 
    this.userProfile = userProfile; 
} 

public EntityStart getEntityStart() { 
    return entityStart; 
} 

public void setEntityStart(EntityStart entityStart) { 
    this.entityStart = entityStart; 
} 

}

实体

/* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 
package lotmovement.business.entity; 
import java.io.Serializable; 
import javax.persistence.*; 


/** 
* 
* @author god-gavedmework 
*/ 

@Entity(name = "USERPROFILE") //Name of the entity 
public class UserProfile implements Serializable{ 

    @Id //signifies the primary key 
    @Column(name = "USER_ID", nullable = false,length = 20) 


    private String userId; 


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

    @Column(name = "FIRST_NAME", nullable = false,length = 20) 

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

    private String lastName; 

    @Column(name = "SECURITY_LEVEL", nullable = false,length = 4) 
    private int securityLevel; 


    @Version 
    @Column(name = "LAST_UPDATED_TIME") 
    private java.sql.Timestamp updatedTime; 

    public String getUserId() { 
     return userId; 
    } 

    public void setUserId(String userId) { 
     this.userId = userId; 
    } 

    public String getPassword() { 
     return password; 
    } 

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

    public String getFirstName() { 
     return firstName; 
    } 

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

    public String getLastName() { 
     return lastName; 
    } 

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

    public int getSecurityLevel() { 
     return securityLevel; 
    } 

    public void setSecurityLevel(int securityLevel) { 
     this.securityLevel = securityLevel; 
    } 

    public java.sql.Timestamp getUpdatedTime() { 
     return updatedTime; 
    } 

    public void setUpdatedTime(java.sql.Timestamp updatedTime) { 
     this.updatedTime = updatedTime; 
    } 

} 


* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 
package lotmovement.business.crud; 

import javax.persistence.EntityManager; 
import javax.persistence.EntityManagerFactory; 
import javax.persistence.EntityTransaction; 
import javax.persistence.Persistence; 
import lotmovement.business.entity.UserProfile; 
import org.apache.openjpa.persistence.OpenJPAEntityManager; 
import org.apache.openjpa.persistence.OpenJPAPersistence; 

public class EntityStart { 
    EntityManagerFactory factory; 
    EntityManager em; 



    public void StartDbaseConnection() 
    { 

     factory = Persistence.createEntityManagerFactory("LotMovementPU"); 
     em = factory.createEntityManager(); 

    } 

    public void StartPopulateTransaction(Object entity){ 

     EntityTransaction userTransaction = em.getTransaction(); 

     userTransaction.begin(); 

     em.merge(entity); 
     userTransaction.commit(); 

     em.close(); 

    } 

    public void CloseDbaseConnection(){ 
     factory.close(); 
    } 

} 

使用跟踪的劝,这是SQL的日志文件

SELECT t0.LAST_UPDATED_TIME, t0.FIRST_NAME, t0.LAST_NAME, t0.PASSWORD, t0.SECURITY_LEVEL FROM USERPROFILE t0 WHERE t0.USER_ID = ? [params=(String) tok] 

这是记录:

USER_ID FIRST_NAME LAST_NAME PASSWORD SECURITY_LEVEL LAST_UPDATED_TIME 
tok   1  1   1   1     2012-12-13 08:46:48.802       

新增的persistence.xml

<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> 
    <persistence-unit name="LotMovementPU" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider> 
    <non-jta-data-source/> 
    <class>lotmovement.business.entity.UserProfile</class> 
    <properties> 
     <property name="openjpa.ConnectionURL" value="jdbc:derby://localhost:1527/LotMovementDBase"/> 
     <property name="openjpa.ConnectionDriverName" value="org.apache.derby.jdbc.ClientDriver"/> 
     <property name="openjpa.ConnectionUserName" value="toksis"/> 
     <property name="openjpa.ConnectionPassword" value="bitoytoksis"/> 
     <property name="openjpa.Log" value="SQL=TRACE"/> 
     <property name="openjpa.ConnectionFactoryProperties" value="PrintParameters=true" /> 
    </properties> 
    </persistence-unit> 
</persistence> 

我发现了问题的根源。这是我如何在Spring插件中实例化类。

当我将find()语句更改为下面时,它现在可以工作。

UserProfile up = entityStart.em.find(UserProfile.class, "tok"); 

但是我怎么能初始化这个使用Spring?下面的代码不工作?

private UserProfile userProfile; 

...... some codes here. 

entityStart.em.find(UserProfile.class, userId); 


    ..... getter setter 
+0

打开OpenJPA SQL跟踪以查看您的记录是否确实进入您的数据库。 openjpa.Log = SQL =跟踪 – Rick

+0

Tnx @rick,但我应该在那里放置?我是一个新手..对不起 – toksis

+0

看来userid没有价值?超级怪异.. 461 LotMovementPU TRACE [http-bio-8080-exec-26] openjpa.jdbc.SQL - 正在执行prepstmnt 2125090910 SELECT t0.LAST_UPDATED_TIME,t0.FIRST_NAME,t0.LAST_NAME,t0。 PASSWORD,t0.SECURITY_LEVEL FROM USERPROFILE t0 WHERE t0.USER_ID =? [params =?] 471 LotMovementPU TRACE [http-bio-8080-exec-26] openjpa.jdbc.SQL - [10 ms]花费 – toksis

回答

0

问题的根本原因。

entityStart.em。find(UserProfile.class,userId); - >它应该是

userProfile = entityStart.em.find(UserProfile.class,userId);