Hibernate使用hbm创建复合主键

时间:2014-11-14 14:20:49

标签: hibernate hibernate-mapping composite-primary-key

我尝试使用hbm文件从表“Peso”合成主键(不是注释,我知道stackoverflow中有很多这些,但我需要仅使用hbm文件进行合成)。我创建了一个中间类来管理id(PesoId类)并将PesoId成员分配给类Peso。

注意:Peso类中的Alumno字段与表Alumnos具有多对一关系。

我不知道哪里失败但是当我尝试保存一个Peso实例(又称对象)时,我得到的错误如下:“整数无法转换为PesoId”。

表格结构

Field   Type    Null    Key Default Extra
Alumno  "int(11) unsigned zerofill" NO  PRI NULL    
Fecha   timestamp   NO  PRI CURRENT_TIMESTAMP   
Peso    decimal(5,2)    NO      NULL

Alumno& Fecha需要是复合主键。 Alumno与alumno的另一张桌子“Alumnos”相关联。

的hbm.xml

<hibernate-mapping>
    <class catalog="***" name="com.***.***.Peso" optimistic-lock="version" table="peso">
        <cache usage="read-only"/>
        <composite-id name="id" class="com.***.***.PesoId">
            <key-property name="alumno" column="Alumno"/>
            <key-property name="fecha" column="Fecha"/>
        </composite-id>
        <many-to-one class="com.***.***s.Alumno" fetch="select" insert="false" name="alumno" update="false">
            <column name="Alumno" not-null="true"/>
        </many-to-one>
        <property name="peso" type="java.lang.Float">
            <column name="Peso" not-null="true" precision="5"/>
        </property>-->
    </class>
</hibernate-mapping>

Peso class

import java.util.Date;

public class Peso implements java.io.Serializable {
    private static final long serialVersionUID = 1L;

    private PesoId id;
    private float peso;

    public Peso() {
    }

    public Peso(PesoId id, float peso) {
        this.id = id;
        this.peso = peso;
    }

    public PesoId getId() {
        return this.id;
    }

    public void setId(PesoId id) {
        this.id = id;
    }

    public float getPeso() {
        return this.peso;
    }

    public void setPeso(float peso) {
        this.peso = peso;
    }

    public Date getFecha() {
        return this.id.getFecha();
    }
}

PesoId class

import java.util.Date;

public class PesoId implements java.io.Serializable {
    private static final long serialVersionUID = 1L;

    private Integer alumno;
    private Date fecha;

    public PesoId() {
    }

    public PesoId(Integer alumno, Date fecha) {
        this.alumno = alumno;
        this.fecha = fecha;
    }


    public Integer getAlumno() {
        return this.alumno;
    }

    public void setAlumno(Integer alumno) {
        this.alumno = alumno;
    }

    public Date getFecha() {
        return this.fecha;
    }

    public void setFecha(Date fecha) {
        this.fecha = fecha;
    }

    public boolean equals(Object other) {
        if ((this == other)) {
            return true;
        }
        if ((other == null)) {
            return false;
        }
        if (!(other instanceof PesoId)) {
            return false;
        }
        PesoId castOther = (PesoId) other;

        return (this.getAlumno() == castOther.getAlumno())
                && ((this.getFecha() == castOther.getFecha()) || (this.getFecha() != null && castOther.getFecha() != null && this.getFecha().equals(castOther.getFecha())));
    }

    public int hashCode() {
        int result = 17;

        result = 37 * result + this.getAlumno();
        result = 37 * result + (getFecha() == null ? 0 : this.getFecha().hashCode());
        return result;
    }

}

0 个答案:

没有答案