使用@OneToOne 注释对子项进行空引用
Null referency for child using @OneToOne annotation
我在子对象上得到一个空引用。
让我解释一下:
我有两个 classes:
@Entity
@Table (name="CONTROLADORES")
@NamedQueries({
@NamedQuery(name="Controlador.findAll", query="SELECT c FROM Controlador c"),
@NamedQuery(name="Controlador.findByIdWithChilds", query="SELECT c FROM Controlador c JOIN FETCH c.cruce WHERE c.id = :id")
})
public class Controlador implements Serializable{
private static final long serialVersionUID = -1018356240274259744L;
@Expose
private long id;
@Id
@GeneratedValue
@GenericGenerator(name="increment", strategy = "increment")
@Column(name="controlador_id")
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
@OneToOne(fetch=FetchType.EAGER, cascade=CascadeType.ALL)
@JoinColumn
public CruceSemaforos getCruce() {
return cruce;
}
public void setCruce(CruceSemaforos cruces) {
this.cruce = cruce;
}
}
和
@Entity
@Table (name="CRUCE_SEMAFOROS")
@NamedQueries({
@NamedQuery(name="CruceSemaforos.findAll", query="SELECT c FROM CruceSemaforos c")
})
public class CruceSemaforos implements Serializable{
/**
*
*/
private static final long serialVersionUID = 140756341984196420L;
@Expose
private long id;
@Id
@GeneratedValue
@Column(name="cruce_id")
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
private Controlador controlador;
@OneToOne
@JoinColumn(name="CONTROLADORES_idControlador", referencedColumnName = "controlador_id")
public Controlador getControlador() {
return controlador;
}
public void setControlador(Controlador controlador) {
this.controlador = controlador;
}
}
我可以创建和保留此对象的实例,并在数据库中使用正确的值设置外键(我的意思是:如果我有 Controlador
在 table CRUCE_SEMAFOROS 中有一个 Cruce CRUCE_SEMAFOROS controlador id 设置在列 CONTROLADORS_idControlador.
这部分工作正常。
问题是,当我尝试获取 Controlador 时,cruce这个class的属性是空的!
我认为这可能是一个注释错误(我是休眠注释世界的新手)。
如有任何帮助,我将不胜感激!
对于每个双向关联,您必须选择一个且仅一个所有者方。在您的例子中,CruceSemaforos.controlador
是该关联的所有者。
因此您需要使用mappedBy
指令将另一端声明为inverse
:
public class Controlador implements Serializable {
...
@OneToOne(fetch=FetchType.EAGER, cascade=CascadeType.ALL, mappedBy = "controlador")
public CruceSemaforos getCruce() {
return cruce;
}
}
我在子对象上得到一个空引用。
让我解释一下:
我有两个 classes:
@Entity
@Table (name="CONTROLADORES")
@NamedQueries({
@NamedQuery(name="Controlador.findAll", query="SELECT c FROM Controlador c"),
@NamedQuery(name="Controlador.findByIdWithChilds", query="SELECT c FROM Controlador c JOIN FETCH c.cruce WHERE c.id = :id")
})
public class Controlador implements Serializable{
private static final long serialVersionUID = -1018356240274259744L;
@Expose
private long id;
@Id
@GeneratedValue
@GenericGenerator(name="increment", strategy = "increment")
@Column(name="controlador_id")
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
@OneToOne(fetch=FetchType.EAGER, cascade=CascadeType.ALL)
@JoinColumn
public CruceSemaforos getCruce() {
return cruce;
}
public void setCruce(CruceSemaforos cruces) {
this.cruce = cruce;
}
}
和
@Entity
@Table (name="CRUCE_SEMAFOROS")
@NamedQueries({
@NamedQuery(name="CruceSemaforos.findAll", query="SELECT c FROM CruceSemaforos c")
})
public class CruceSemaforos implements Serializable{
/**
*
*/
private static final long serialVersionUID = 140756341984196420L;
@Expose
private long id;
@Id
@GeneratedValue
@Column(name="cruce_id")
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
private Controlador controlador;
@OneToOne
@JoinColumn(name="CONTROLADORES_idControlador", referencedColumnName = "controlador_id")
public Controlador getControlador() {
return controlador;
}
public void setControlador(Controlador controlador) {
this.controlador = controlador;
}
}
我可以创建和保留此对象的实例,并在数据库中使用正确的值设置外键(我的意思是:如果我有 Controlador 在 table CRUCE_SEMAFOROS 中有一个 Cruce CRUCE_SEMAFOROS controlador id 设置在列 CONTROLADORS_idControlador.
这部分工作正常。
问题是,当我尝试获取 Controlador 时,cruce这个class的属性是空的!
我认为这可能是一个注释错误(我是休眠注释世界的新手)。
如有任何帮助,我将不胜感激!
对于每个双向关联,您必须选择一个且仅一个所有者方。在您的例子中,CruceSemaforos.controlador
是该关联的所有者。
因此您需要使用mappedBy
指令将另一端声明为inverse
:
public class Controlador implements Serializable {
...
@OneToOne(fetch=FetchType.EAGER, cascade=CascadeType.ALL, mappedBy = "controlador")
public CruceSemaforos getCruce() {
return cruce;
}
}