2013-08-03 2 views
0

특정 사용자와 관련된 모든 환자를 반환하려고합니다. 그러나 날짜를 반환하려고 할 때 적절한 생성자가 없다는 오류가 나타납니다.타임 스탬프 최대 절전 모드

package com.objects; 

import java.io.Serializable; 
import java.sql.Date; 
import java.sql.Timestamp; 
import java.util.HashSet; 
import java.util.Set; 

import javax.persistence.CascadeType; 
import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.FetchType; 
import javax.persistence.Id; 
import javax.persistence.JoinTable; 
import javax.persistence.ManyToMany; 
import javax.persistence.JoinColumn; 
import javax.persistence.JoinTable; 
import javax.persistence.OneToMany; 
import javax.persistence.Table; 

import org.hibernate.annotations.CollectionOfElements; 
import org.hibernate.cfg.Configuration; 
import org.hibernate.envers.reader.FirstLevelCache; 

import javax.persistence.UniqueConstraint; 
@Entity 
@Table(name = "patient", uniqueConstraints = { 
     @UniqueConstraint(columnNames = "paitentFirstName"), 
     @UniqueConstraint(columnNames = "paitentLastName") }) 

public class Patient implements Serializable { 

    @Id 
    @Column(name="id") 
    private int id; 
    private String paitentFirstName; 
    private String paitentLastName; 
    private Timestamp dateOfbirth; 
    private String sex; 



    @ManyToMany(cascade = {CascadeType.ALL},fetch=FetchType.EAGER) 
     @JoinTable(name="User_Patient", 
        joinColumns={@JoinColumn(name="id")}, 
        inverseJoinColumns={@JoinColumn(name="userName")}) 
     private Set<User> users = new HashSet<User>(); 



    @OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.patient", cascade=CascadeType.ALL) 
     private Set<JoinDrugPatient> JoinDrugPatient = new HashSet<JoinDrugPatient>(0); 


    public Patient(int id, String paitentFirstName, String paitentLastName, 
      Timestamp dateOfbirth,String sex) { 
     this.id = id; 
     this.paitentFirstName = paitentFirstName; 
     this.paitentLastName = paitentLastName; 
     this.dateOfbirth = dateOfbirth; 
     this.sex = sex; 
    } 


    public Patient(int id, String paitentFirstName,String lastName,String sex){ 
     this.id = id; 
     this.paitentFirstName = paitentFirstName; 
     this.paitentLastName=lastName; 
     this.sex=sex; 
    } 
    public Patient(String date){ 
     paitentFirstName=date; 
    } 

    public Patient(){} 

    public int getId() { 
     return id; 
    } 


    public void setId(int id) { 
     this.id = id; 
    } 


    @Column(name = "paitentFirstName", nullable = false, length = 10) 
    public String getPaitentFirstName() { 
     return paitentFirstName; 
    } 


    public void setPaitentFirstName(String paitentFirstName) { 
     this.paitentFirstName = paitentFirstName; 
    } 

    @Column(name = "paitentLastName", nullable = false, length = 10) 
    public String getPaitentLastName() { 
     return paitentLastName; 
    } 


    public void setPaitentLastName(String paitentLastName) { 
     this.paitentLastName = paitentLastName; 
    } 


    public Timestamp getDateOfbirth() { 
     return dateOfbirth; 
    } 


    public void setDateOfbirth(Timestamp dateOfbirth) { 
     this.dateOfbirth = dateOfbirth; 
    } 


    public String getSex() { 
     return sex; 
    } 


    public void setSex(String sex) { 
     this.sex = sex; 
    } 


    public Set<User> getUsers() { 
     return users; 
    } 


    public void setUsers(Set<User> users) { 
     this.users = users; 
    } 

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.patient", cascade=CascadeType.ALL) 
    public Set<JoinDrugPatient> getJoinDrugPatient() { 
     return JoinDrugPatient; 
    } 


    public void setJoinDrugPatient(Set<JoinDrugPatient> joinDrugPatient) { 
     JoinDrugPatient = joinDrugPatient; 
    } 










    public Set<JoinDrugPatient> getStockCategories() { 
     return JoinDrugPatient; 
    } 


    public void setStockCategories(Set<JoinDrugPatient> stockCategories) { 
     this.JoinDrugPatient = stockCategories; 
    } 


    @Override 
    public String toString() { 
     return "Patient [id=" + id + ", paitentFirstName=" + paitentFirstName 
       + ", paitentLastName=" + paitentLastName + ", dateOfbirth=" 
       + dateOfbirth + ", sex=" + sex + "]"; 
    } 





} 

이 쿼리입니다 (최대 절전 모드)

List<Patient> l=session.createQuery("Select new Patient(p.id,p.paitentFirstName,p.paitentLastName,p.dateOfbirth,p.sex)" 
             +" from Patient p join p.users a where a.UserName=?") 
             .setParameter(0, userName) 
             .list(); 
+0

왜 HQL 내부에서 새로운 연산자를 사용하고 단순히'from Patient p ... '를 사용하지 않습니까? new() 연산자는 다른 엔티티에 의해 생성 된 엔티티를 빌드 할 때 유용합니다. ([select clause] (http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/queryhql을 확인하십시오. html # queryhql-select)) –

+0

게시 할 때 코드를 자동 포맷하고 추가 빈 줄을 제거하십시오. 그것은 훨씬 쉽게 읽을 수 있습니다. – chrylis

답변

1

이 문제는 그대로 정말 문제 자바있는 최대 절전 모드 문제가되지 않습니다 : 이 환자 클래스 Effective Java (2nd Edition)에 설명되어 있습니다.

인스턴스 라이브러리를 확장하고 값 구성 요소를 추가하는 클래스가 Java 플랫폼 라이브러리에 있습니다. 예를 들어 java.sql.Timestamp는 java.util.Date를 확장하고 나노초 인 필드를 추가합니다. Timestamp에 대한 equals 구현은 대칭을 벗어나 이며 Timestamp 및 Date 객체가 동일한 컬렉션에 으로 사용되거나 다른 경우 혼합되어 있으면 비정상적인 동작이 발생할 수 있습니다. Timestamp 클래스에는 프로그래머가 날짜를 혼합하고 타임 스탬프에주의하도록 경고하는 경고 문구가 있습니다. 을 분리하지 않으면 문제가 발생하지 않지만 혼합하지 못하도록 막을 수는 없으며 오류가 발생하면 디버그하기가 어려울 수 있습니다. Timestamp 클래스의이 동작은 실수 였으므로 에뮬레이트해서는 안됩니다. (Bloch, Effective Java, 2nd Ed.)

무엇이 클래스 Users에 있습니까? 코드에서 도처에 java.sql.Timestamp을 사용하는 경우에는 에 문제가 없습니다.

관련 문제