2013-08-20 3 views
0

모델이 있습니다. 이 부분이 있습니다 : enter image description herehibernate.hbm2ddl.auto = update가 작동하지 않습니다.

모델은 jpa annotations.Everywhere로 매핑되었습니다. fetchType = EAGER를 사용합니다. 데이터베이스에서 공석을로드하는 경우 status_for_vacancy 개체가 두 개 중복됩니다. 속성 hbm2ddl.auto = update를 사용합니다. 데이터베이스의 새 스키마를 만들고 데이터를 채우는 경우 status_for_vacancy 개체가 중복되지 않았습니다. 정말요?

코드 : 공석 :

@Entity 
@Table(name = "vacancy") 
@XmlRootElement(name="vacancy") 

public class Vacancy { 

    private List<VacancyStatus> statusList = new LinkedList<VacancyStatus>(); 

    @OneToMany(mappedBy = "vacancy", cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
    public List<VacancyStatus> getStatusList() { 
     return statusList; 
    } 

    public void setStatusList(List<VacancyStatus> statusList) { 
     this.statusList = statusList; 
    } 

} 

status_for_vacancy :

@Entity 
@Table(name = "status_for_vacancy") 
public class StatusForVacancy extends AbstractStatus { 

    public StatusForVacancy() { 
     super(); 
    } 

    public StatusForVacancy(Integer id, String name) { 
     super(id, name); 
    } 

} 


@MappedSuperclass 
@XmlRootElement 
public abstract class AbstractStatus { 

    private Integer id; 
    private String name; 

    public AbstractStatus() { 
     super(); 
    } 

    public AbstractStatus(String name) { 
     super(); 
     this.name = name; 
    } 

    public AbstractStatus(Integer id, String name) { 
     super(); 
     this.id = id; 
     this.name = name; 
    } 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column (name ="id") 
    public Integer getId() { 
     return id; 
    } 

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

    @Column(name = "name") 
    @NotEmpty 
    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

} 

vacancy_status :

@Entity 
@Table(name = "vacancy_status") 
public class VacancyStatus extends AbstractHistoryStatus { 

    private Vacancy vacancy; 
    private StatusForVacancy status; 

    public VacancyStatus() { 
     super(); 
    } 

    public VacancyStatus(Integer id, User author, Date date, 
      Vacancy vacancy, StatusForVacancy status) { 
     super(id, author, date); 
     this.vacancy = vacancy; 
     this.status = status; 
    } 


    @ManyToOne 
    @JoinColumn(name = "vacancy_id") 
    public Vacancy getVacancy() { 
     return vacancy; 
    } 

    public void setVacancy(Vacancy vacancy) { 
     this.vacancy = vacancy; 
    } 

    @ManyToOne 
    @JoinColumn(name = "status_id") 
    public StatusForVacancy getStatus() { 
     return status; 
    } 

    public void setStatus(StatusForVacancy status) { 
     this.status = status; 
    } 
} 


@MappedSuperclass 
public abstract class AbstractHistoryStatus { 

    private Integer id; 
    private User author; 
    private Date date; 


    public AbstractHistoryStatus() { 
    } 

    public AbstractHistoryStatus(Integer id, User author, Date date) { 
     super(); 
     this.id = id; 
     this.author = author; 
     this.date = date; 
    } 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "id") 
    public Integer getId() { 
     return id; 
    } 

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

    @ManyToOne 
    public User getAuthor() { 
     return author; 
    } 

    public void setAuthor(User author) { 
     this.author = author; 
    } 

    @Column(name="creation_date") 
    public Date getDate() { 
     return date; 
    } 

    public void setDate(Date date) { 
     this.date = date; 
    } 

} 
,

이 엔티티의 모든 매핑 코드입니다. 디버거

: enter image description here

ID 모두 == 500 ==>는 동일한 객체임을 이해 동면.

나는 새 데이터베이스 이전 데이터베이스에서 모든 데이터를 추가하려고 - (

나는이 문제의 출현의 원인을 해결 나는 오래된 오류가 그것의 모습을 내가 주목하는 기록을 추가하면 테이블 :. enter image description here

+0

이 엔티티를 나타내는 개체 코드를 제공 할 수 있습니까? status_for_vacancy 코드는 무엇입니까? 이 객체에 대해 equals() 및 hashCode() 메서드를 어떻게 정의 했습니까? – lostdorje

+0

standart hashcode 및 equals 메서드를 다시 작성하지 마십시오 –

+0

토픽에 소스 코드 추가 –

답변

0

equals() 및 hashCode() 메서드를 사용하는 것이 좋습니다. 표준 equals()/hashCode()는 참조 동등성을 구현합니다 (do 2 객체는 동일한 메모리 위치를 참조합니다). 따라서 최대 절전 모드에서 메모리에 ' ,하지만 그들은 같은 메모리 위치를 참조하지 않는 경우 객체가 두 번 나타날 것입니다.하지만 기본 키가 동일하면 equals()를 구현하면 두 개 Hibernate는 메모리에있는 같은 객체의 복사본을 당신에게 복사하지 않을 것이다.

2.4 기본 키와 엔티티 신원 모든 개체에 기본 키가 있어야합니다

:

는 JPA 스펙을 참조하십시오. ... 차 키 값은 고유의 영속 컨텍스트 내에서 EntityManager의 조작에 엔티티 인스턴스를 식별

또한,이 SO post 참조.

+0

토픽 –

+0

에 정보를 추가합니다. 이상합니다. 그 밖의 무엇이 문제가 될지 모르겠습니다. 하지만 여전히 equals()/hashCode()를 재정의하는 것이 좋습니다. 나중에 다른 문제가 나타날 가능성이 있습니다. – lostdorje

+0

해시 코드를 추가하고 vacancy_status와 같음 - 변경 사항이 표시되지 않음 –