2016-07-08 2 views
2

저는 Hito와 Portada의 두 클래스로 작동하는 Hibernate @OneToOne 어노테이션을 얻으려고합니다. Portada 테이블에는 Hito라는 int 특성 인 Hito의 foreing 키가 있습니다.Hibernate @OneToOne이 작동하지 않습니다.

Hito :

@Entity 
@Table(name = "hito") 
public class Hito implements Serializable { 
    //...other attributes 
    private Portada portada; 

    //...getters and setters from other attributes 

    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "hito") 
    public Portada getPortada(){ return portada;} 

    public void setPortada(Portada portada){ this.portada = portada;} 
} 

Portada : 내 실체는 다음과 같다 내가 hito.getPortada()를 호출 할 때

@Entity 
@Table(name = "portada") 
public class Portada { 
    //...other attributes 
    private Hito hito; 

    //...getters and setters from other attributes 
    @OneToOne(fetch = FetchType.EAGER, optional = false) 
    @JoinColumn(name = "hito") 
    public Hito getHito() {return hito;} 

    public void setHito(Hito hito) {this.hito = hito;} 

} 

, 나는이 Portada 객체를 기대하지만, null를 돌려줍니다.

제안 사항? 고급

+0

테이블에 양방향 설정이 없으므로 Portada 클래스에서 hito 인스턴스를 제거하십시오. Hito 클래스의 getPortada() 메소드에서 매핑 된 속성을 제거하십시오. – mprabhat

+0

@mprabhat 그럴 수 없습니다. 내가 매핑 된 속성을 제거하면 최대 절전 모드에서 오류가 발생합니다. Portada 클래스의 hito 인스턴스를 제거하면 무엇을 의미합니까? –

+0

@mprabhat 오류 : org.hibernate.engine.jdbc.spi.SqlExceptionHelper - '필드 목록'의 알 수없는 열 'hito0_.portada_id'. 히토 속성을 삭제 하시겠습니까? –

답변

4

에서 덕분에 내가 코드를 사용하여 문제를 재현하려 :

@MappedSuperclass 
public abstract class BaseEntity { 
    @Id @GeneratedValue 
    private Long id; 

    @Version 
    private long version; 

    public Long getId() { 
     return id; 
    } 

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

    public long getVersion() { 
     return version; 
    } 

    public void setVersion(long version) { 
     this.version = version; 
    } 
} 

@Entity 
@Table(name = "portada") 
public class Portada extends BaseEntity { 
    //...other attributes 
    @OneToOne(fetch = FetchType.EAGER, optional = false) 
    @JoinColumn(name = "hito") 
    private Hito hito; 

    //...getters and setters from other attributes 
    public Hito getHito() {return hito;} 

    public void setHito(Hito hito) {this.hito = hito;} 

} 

@Entity 
@Table(name = "hito") 
public class Hito extends BaseEntity implements Serializable { 
    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "hito") 
    private Portada portada; 


    public Portada getPortada(){ return portada;} 

    public void setPortada(Portada portada){ this.portada = portada;} 
} 

// app: 

      Portada p = new Portada(); 
      Hito h = new Hito(); 

      p.setHito(h); 
      h.setPortada(p); 

      entityManager.persist(h); 
      entityManager.flush(); 
      entityManager.clear(); 

      Hito h2 = entityManager.find(Hito.class, h.getId()); 
      System.out.println(h2.getPortada().toString()); 

      tx.commit(); 

마지막 find 생성 된 SQL :

select 
    hito0_.id as id1_4_0_, 
    hito0_.version as version2_4_0_, 
    portada1_.id as id1_7_1_, 
    portada1_.version as version2_7_1_, 
    portada1_.hito as hito3_7_1_ 
from 
    hito hito0_ 
left outer join 
    portada portada1_ 
     on hito0_.id=portada1_.hito 
where 
    hito0_.id=? 

모든 것이 나를 위해 일한 ...

편집 : 차이점은 속성 대신 필드에 매핑 속성을 두는 것이지만이 문제에서는 중요하지 않습니다. persistance.xml이나 hibernate config에 두 클래스를 모두 추가했는지 확인하십시오.

+0

코드를 보면이 문제점을 발견했습니다. 내 DAO는 em.find() 대신 entityManager.createQuery()를 사용했습니다 ...이 메서드를 변경하면 모든 것이 잘 작동합니다! 감사합니다. 코드는 매우 영감을 받았습니다. D –

관련 문제