2016-07-08 14 views
2

Ich versuche Hibernate @OneToOne Annotation arbeiten mit 2 Klassen, Hito und Portada. Portada-Tabelle hat den foreing-Schlüssel von Hito, ein int-Attribut namens hito. Meine Entitäten wie folgt aussieht:Hibernate @OneToOne funktioniert nicht

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:

@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;} 

} 

Als ich hito.getPortada() aufrufen, erwarte ich ein Portada Objekt, aber es gibt null zurück.

Irgendwelche Vorschläge? Vielen Dank im fortgeschrittenen

+0

Ihre Tabellen haben keine bidirektionale Konfiguration, entfernen Sie die Hito-Instanz aus der Portada-Klasse. Entfernen Sie das gemappt von der getPortada() - Methode in Ihrer Hito-Klasse – mprabhat

+0

@mprabhat Ich kann das nicht tun. Wenn ich mapped by Attribut von entfernen, gibt mir Hibernate einen Fehler. Was meinst du mit Entfernen der Hito-Instanz aus der Portada-Klasse? –

+0

@mprabhat FEHLER: org.hibernate.engine.jdbc.spi.SqlExceptionHelper - Unbekannte Spalte 'hito0_.portada_id' in 'Feldliste'. Meinst du hito Attribut entfernen? –

Antwort

4

Ich habe versucht, das Problem mit dem Code zu reproduzieren:

@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(); 

Die letzte find generierten 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=? 

Alles für mich gearbeitet ...

EDIT: Der einzige Unterschied ist, dass ich Mapping-Attribute lieber auf Felder als auf Eigenschaften setze, aber das spielt in diesem Problem keine Rolle. Bitte überprüfen Sie, ob Sie beide Klassen zu persistance.xml oder hibernate config hinzufügen.

+0

Mit Blick auf Ihren Code habe ich das Problem gefunden. Mein DAO verwendet entityManager.createQuery() anstelle von em.find() ... Wenn Sie diese Methode ändern, funktioniert jetzt alles einwandfrei! Danke, dein Code war sehr inspirierend: D –

Verwandte Themen