休眠@OneToOne为空

米格尔·奥尔特加(Miguel Ortega)

我试图让Hibernate @OneToOne注释与2个类(Hito和Portada)一起使用。Portada表具有Hito的外键,该属性是称为hito的int属性。

我的实体看起来像这样:

人人:

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

封面:

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

}

当我调用hito.getPortada()时,我希望有一个Portada对象,但它返回null。

有什么建议么?

犀利的人

我试图用代码重现您的问题:

@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配置中。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章