2012-12-12 1 views
0

사용자 로그인 프로그램에서 이상한 시나리오가 있습니다. OPEN JPA find()가 데이터베이스에서 엔티티 값을 검색 할 수 없습니다.

  1. )는 (병합하여 레코드를 삽입 등을 기록 .. 사용자 ID 암호
  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; 
    } 




} 

검사기 프로그램

/* *이 템플릿을 변경하려면, 선택한 도구 | 템플릿 *을 선택하고 편집기에서 템플릿을 엽니 다. */ 패키지 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; 
} 

}

법인 adviced로 추적을 사용

/* 
* 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의 로그입니다

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> 

나는 문제의 근본 원인을 발견 :

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] 

이 는 기록이다. Spring Plugin에서 클래스를 인스턴스화하는 방법에 대해 설명합니다.

find() 문을 아래로 변경하면 이제 작동합니다.

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

어떻게 스프링을 사용하여 초기화 할 수 있습니까? 아래의 코드는 작동하지 않습니까?

private UserProfile userProfile; 

...... some codes here. 

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


    ..... getter setter 
+0

OpenJPA SQL 추적을 켜서 기록이 실제로 데이터베이스에 저장되는지 확인하십시오. openjpa.Log = SQL = trace – Rick

+0

Tnx @rick,하지만 그 위치는 어디입니까? 나는 초보자입니다. 죄송합니다. – toksis

+0

userid에 값이없는 것 같습니까? 매우 이상한 .. 461 LotMovementPU 추적 [http-bio-8080-exec-26] openjpa.jdbc.SQL - prepstmnt 실행 2125090910 SELECT t0.LAST_UPDATED_TIME, t0.FIRST_NAME, t0.LAST_NAME, t0. 패스워드, 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);

관련 문제