2012-12-12 14 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);