我正在尝试让 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/