使用@OneToOne注释的子项的空引用

时间:2015-01-17 18:40:21

标签: java hibernate jpa orm hibernate-mapping

我在子对象上得到一个空引用。

让我解释一下:

我有两个班级:

@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 表CRUCE_SEMAFOROS中有一个 Cruce ,controlador id在 CONTROLADORS_idControlador 列中设置。

这部分工作正常。

问题在于,当我尝试获取 Controlador 时,此类的 cruce 属性是空!

我认为那可能是一个注释错误(我是hibernate注释领域的新东西)。

请感谢任何帮助!

1 个答案:

答案 0 :(得分:3)

对于每个双向关联,您必须选择一个且只有一个所有者方。在您的情况下,CruceSemaforos.controlador是此关联的所有者。

因此,您需要使用inverse指令将另一方声明为mappedBy

public class Controlador implements Serializable {

    ...

    @OneToOne(fetch=FetchType.EAGER, cascade=CascadeType.ALL, mappedBy = "controlador") 
    public CruceSemaforos getCruce() {
        return cruce;
    }

}