2

내 응용 프로그램에 대해 Hibernate 3.5.6을 사용하고 있습니다.이 응용 프로그램에서 hbm.xml 파일을 사용하여 POJO를 데이터베이스 테이블 열에 매핑합니다.최대 절전 모드에서 빈의 원하는 속성 만 가져 오는 방법은 무엇입니까?

이 응용 프로그램에는 아래와 같은 사용자 bean이 있습니다.

public class User { 
// login info 
private long id; 
private String type; 

private String userName; 
private String password; 
private String securityQuestionStr; 
private String securityAnswer; 

// personal info 
private String firstName; 
private String middleName; 
private String lastName; 

/** 
* <b>{@link GenderType} gender</b> 
*/ 
private GenderType gender; 

private Date dateOfBirth; 

// other related info 
/** 
* <b>{@link UserType} userType</b> 
*/ 
private UserType userType; 

// contact info 
private Long mobileNo; 
private Long businessPhoneNo; 
private Long homePhoneNo; 
private Long faxNo; 
private String email; 
private String alternateEmail; 

/** 
* <b>{@link RegistrationStatus} userStatus</b> 
*/ 
private RegistrationStatus userStatus; 

/** 
* <b>{@link Post} posts</b> 
*/ 
private String securityAnswerHash; 
private String passwordHash; 
private String encryptedPassword; 
private String encryptedSecurityAnswer; 
private String nationality; 

private String portal; 
private float version; 
private Date createdDate; 
private User createdUser; 
private String createdIP; 
private Date lastModifiedDate; 
private User lastModifiedUser; 
private String lastModifiedIP; 
private boolean recordStatus; 
private String publicKey; 
private String certificateName; 
private String signPublicKey; 
private String signCertificateName; 
private boolean isEtoken; 

public long getId() { 
    return id; 
} 
public void setId(long id) { 
    this.id = id; 
} 
public String getType() { 
    return type; 
} 
public void setType(String type) { 
    this.type = type; 
} 
public String getUserName() { 
    return userName; 
} 
public void setUserName(String userName) { 
    this.userName = userName; 
} 
public String getPassword() { 
    return password; 
} 
public void setPassword(String password) { 
    this.password = password; 
} 
public String getSecurityQuestionStr() { 
    return securityQuestionStr; 
} 
public void setSecurityQuestionStr(String securityQuestionStr) { 
    this.securityQuestionStr = securityQuestionStr; 
} 
public String getSecurityAnswer() { 
    return securityAnswer; 
} 
public void setSecurityAnswer(String securityAnswer) { 
    this.securityAnswer = securityAnswer; 
} 
public String getFirstName() { 
    return firstName; 
} 
public void setFirstName(String firstName) { 
    this.firstName = firstName; 
} 
public String getMiddleName() { 
    return middleName; 
} 
public void setMiddleName(String middleName) { 
    this.middleName = middleName; 
} 
public String getLastName() { 
    return lastName; 
} 
public void setLastName(String lastName) { 
    this.lastName = lastName; 
} 
public GenderType getGender() { 
    return gender; 
} 
public void setGender(GenderType gender) { 
    this.gender = gender; 
} 
public Date getDateOfBirth() { 
    return dateOfBirth; 
} 
public void setDateOfBirth(Date dateOfBirth) { 
    this.dateOfBirth = dateOfBirth; 
} 
public UserType getUserType() { 
    return userType; 
} 
public void setUserType(UserType userType) { 
    this.userType = userType; 
} 
public Long getMobileNo() { 
    return mobileNo; 
} 
public void setMobileNo(Long mobileNo) { 
    this.mobileNo = mobileNo; 
} 
public Long getBusinessPhoneNo() { 
    return businessPhoneNo; 
} 
public void setBusinessPhoneNo(Long businessPhoneNo) { 
    this.businessPhoneNo = businessPhoneNo; 
} 
public Long getHomePhoneNo() { 
    return homePhoneNo; 
} 
public void setHomePhoneNo(Long homePhoneNo) { 
    this.homePhoneNo = homePhoneNo; 
} 
public Long getFaxNo() { 
    return faxNo; 
} 
public void setFaxNo(Long faxNo) { 
    this.faxNo = faxNo; 
} 
public String getEmail() { 
    return email; 
} 
public void setEmail(String email) { 
    this.email = email; 
} 
public String getAlternateEmail() { 
    return alternateEmail; 
} 
public void setAlternateEmail(String alternateEmail) { 
    this.alternateEmail = alternateEmail; 
} 
public RegistrationStatus getUserStatus() { 
    return userStatus; 
} 
public void setUserStatus(RegistrationStatus userStatus) { 
    this.userStatus = userStatus; 
} 
public String getSecurityAnswerHash() { 
    return securityAnswerHash; 
} 
public void setSecurityAnswerHash(String securityAnswerHash) { 
    this.securityAnswerHash = securityAnswerHash; 
} 
public String getPasswordHash() { 
    return passwordHash; 
} 
public void setPasswordHash(String passwordHash) { 
    this.passwordHash = passwordHash; 
} 
public String getEncryptedPassword() { 
    return encryptedPassword; 
} 
public void setEncryptedPassword(String encryptedPassword) { 
    this.encryptedPassword = encryptedPassword; 
} 
public String getEncryptedSecurityAnswer() { 
    return encryptedSecurityAnswer; 
} 
public void setEncryptedSecurityAnswer(String encryptedSecurityAnswer) { 
    this.encryptedSecurityAnswer = encryptedSecurityAnswer; 
} 
public String getNationality() { 
    return nationality; 
} 
public void setNationality(String nationality) { 
    this.nationality = nationality; 
} 
public String getPortal() { 
    return portal; 
} 
public void setPortal(String portal) { 
    this.portal = portal; 
} 
public float getVersion() { 
    return version; 
} 
public void setVersion(float version) { 
    this.version = version; 
} 
public Date getCreatedDate() { 
    return createdDate; 
} 
public void setCreatedDate(Date createdDate) { 
    this.createdDate = createdDate; 
} 
public User getCreatedUser() { 
    return createdUser; 
} 
public void setCreatedUser(User createdUser) { 
    this.createdUser = createdUser; 
} 
public String getCreatedIP() { 
    return createdIP; 
} 
public void setCreatedIP(String createdIP) { 
    this.createdIP = createdIP; 
} 
public Date getLastModifiedDate() { 
    return lastModifiedDate; 
} 
public void setLastModifiedDate(Date lastModifiedDate) { 
    this.lastModifiedDate = lastModifiedDate; 
} 
public User getLastModifiedUser() { 
    return lastModifiedUser; 
} 
public void setLastModifiedUser(User lastModifiedUser) { 
    this.lastModifiedUser = lastModifiedUser; 
} 
public String getLastModifiedIP() { 
    return lastModifiedIP; 
} 
public void setLastModifiedIP(String lastModifiedIP) { 
    this.lastModifiedIP = lastModifiedIP; 
} 
public boolean isRecordStatus() { 
    return recordStatus; 
} 
public void setRecordStatus(boolean recordStatus) { 
    this.recordStatus = recordStatus; 
} 
public String getPublicKey() { 
    return publicKey; 
} 
public void setPublicKey(String publicKey) { 
    this.publicKey = publicKey; 
} 
public String getCertificateName() { 
    return certificateName; 
} 
public void setCertificateName(String certificateName) { 
    this.certificateName = certificateName; 
} 
public String getSignPublicKey() { 
    return signPublicKey; 
} 
public void setSignPublicKey(String signPublicKey) { 
    this.signPublicKey = signPublicKey; 
} 
public String getSignCertificateName() { 
    return signCertificateName; 
} 
public void setSignCertificateName(String signCertificateName) { 
    this.signCertificateName = signCertificateName; 
} 
public boolean isEtoken() { 
    return isEtoken; 
} 
public void setEtoken(boolean isEtoken) { 
    this.isEtoken = isEtoken; 
} 

} 나는, 데이타베이스에서 사용자를 가져 오기 할 때

는 지금, 나는 기준을 사용하거나 얻거나 부하 방법했다. 하지만 나는 최대 절전 모드로 생성 된 쿼리를 보았을 때 쿼리 길이가 너무 깁니다. 이것은 사용자 bean에 38 개의 속성이 있기 때문입니다. 모든 속성은 String 및 프리미티브 유형입니다 (속성 중 하나는 Has 유형이 아닙니다). -A 다른 bean 클래스)

그러나 실제 필요한 ID는 10-12 또는 한 번에 20 개의 등록 정보 일 수 있습니다. 최대 절전 모드로 사용자 bean을 가져올 때 모든 등록 정보를 가져 오지 않으려합니다.

이 경우 나는 가져 오기만하려는 생성자에서 속성의 수를 제공 할 수있는 HQL을 보았습니다. 다음과 같이 :

Query query = session 
      .createQuery("select new User(id, userName) from User where id=?"); 
    query.setParameter(0, 1l); 

질의 길이가 짧은 그래서 ID와 사용자 이름을 가져올 만 쿼리를 발사하고 또한 내가에만 필요 속성을 얻었다.

하지만 매번 다른 유형의 속성을 사용하여 쿼리를 작성하는 것은 매우 어렵습니다. 또한 POJO 클래스에서 동일한 서명 생성자가 필요합니다. User 클래스에있는 일부 콜렉션 및 다른 Bean과 동시에 가져 오는 것이 더 어려울 수 있습니다.

그래서 모든 것이 아닌 필수 속성 (문자열 또는 기본 유형)에 대해서만 쿼리를 시작하기 위해 최대 절전 모드를 제한하는 다른 방법이 있는지 알고 싶습니다.

답변

1

이 경우 조기에 최적화 된 것처럼 보입니다. 특히 쿼리가 인스턴스에서 하나의 사용자 인스턴스 만 반환하는 경우에 특히 그렇습니다.

쿼리는 완전한 사용자를 반환하지 않기 때문에 실제로 혼란 스럽습니다. 거의 모든 필드가 null로 설정된 사용자가 클래스의 invariant를 손상시킬 수 있기 때문에 반환됩니다. 호출자가 일부 필드가 실제로 데이터베이스에서 null인지 또는 쿼리가 데이터를로드하지 않기 때문에 null인지 여부를 알 수있는 방법이 없습니다.

이 필드를로드하면 실제로 성능 문제가 발생하는지 먼저 측정하고 if 및 where가있는 경우에만 최적화합니다. 그리고 나는 쿼리에 의해 실제로로드 된 필드만을 포함 할 전용 UserDTO를 사용할 것이다. 참조 설명서가 말한대로 당신은 또한 속성의 게으른 로딩을 가능하게 fetch groups에서 보이지만 수 있습니다

이것이 대개 마케팅 특징임을 유의하시기 바랍니다; 최적화 열은 행 읽기 최적화보다 훨씬 중요합니다. 그러나 극한 경우에만 클래스의 일부 속성을로드하는 것이 유용 할 수 있습니다. 예를 들어 레거시 테이블에 수백 개의 열이 있고 데이터 모델을 향상시킬 수없는 경우

1

동적 쿼리를 준비하는 유틸리티를 작성할 수 있습니다.

DataBaseUtil.createPropertySpecificQuery(Clazz entity, String[] properties, String[] conditionParams, String[] conditionOperators){} write a logic to build query. 

POJO에 콜렉션을 연결할 때 조인을 사용하는 로직을 추가 할 수 있습니다.

나는 유용하다고 그들은 변환을 관리 두통을 많이 감소로

+0

헤이 reply.I에 대한 Bhavesh 덕분에이을 다할 것 등을 변경 DTO 이상이 선호. –

관련 문제