java - Hibernate @OneToOne 为空

标签 java hibernate

我正在尝试让 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 配置中。

关于java - Hibernate @OneToOne 为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38271111/

相关文章:

java - 具有本地代码库的 JNLP - 如何更新?

java - NetBeans 调试期间出现异常

java - 无法获取 org.hibernate.persister.entity.SingleTableEntityPersister 的构造函数

java - 强制 Hibernate 插入而不使用 Select 语句

java - JavaFx 中的表设计

java - 为什么空引用打印为 "null"

java - 是否有用于解码 php session 数据的 Java 库?

java - 我如何知道对象来自哪里,session缓存还是sessionFactory缓存

java - 如何更改 JPA - Spring Framework 数据库中的顺序

java - Weblogic 9.2支持Sun Jdk 1.6吗?