java - Hibernate 映射复合键 ManyToMany 导致 ClassCastException

标签 java hibernate many-to-many hql classcastexception

我几个小时以来一直在努力解决 hibernate 问题,并且在任何网站上都找不到任何帮助。我已经阅读了数十篇教程,尝试了所有方法,但最终总是遇到类转换异常或编译错误。

数据库(mysql innodb)这个特定部分的模式是 Plane 和 Steward。他们共享Many2Many 关系。

使用 Hibernate 代码生成和 Hibernate 工具,我生成了所有 POJO 类和映射文件(包括 FlightHasStewardId 和 FlightHasSteward -> 映射复合 ID)。

我现在想宣读 100 航类的所有乘务员!

注意:读取其他实体有效,仅 M2M 读取 ClassCastEX 中的结果。

这是我的输入:

FlightHasSteward 的映射:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- Generated Jan 1, 2014 1:52:14 PM by Hibernate Tools 4.0.0 -->
<hibernate-mapping>
    <class name="FlightHasSteward" table="Flight_has_Steward" catalog="project3flight">
        <composite-id name="id" class="FlightHasStewardId">
            <key-property name="flightIdflight" type="int">
                <column name="Flight_idflight" />
            </key-property>
            <key-property name="stewardIdsteward" type="int">
                <column name="Steward_idsteward" />
            </key-property>
        </composite-id>
    </class>
</hibernate-mapping>

FlightHasSteward.java:

// default package
// Generated Jan 1, 2014 1:52:14 PM by Hibernate Tools 4.0.0

/**
 * FlightHasSteward generated by hbm2java
 */
public class FlightHasSteward implements java.io.Serializable {

    private FlightHasStewardId id;

    public FlightHasSteward() {
    }

    public FlightHasSteward(FlightHasStewardId id) {
        this.id = id;
    }

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

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

}

FlightHasStewardId.java:

// default package
// Generated Jan 1, 2014 1:52:14 PM by Hibernate Tools 4.0.0

/**
 * FlightHasStewardId generated by hbm2java
 */
public class FlightHasStewardId implements java.io.Serializable {

    private int flightIdflight;
    private int stewardIdsteward;

    public FlightHasStewardId() {
    }

    public FlightHasStewardId(int flightIdflight, int stewardIdsteward) {
        this.flightIdflight = flightIdflight;
        this.stewardIdsteward = stewardIdsteward;
    }

    public int getFlightIdflight() {
        return this.flightIdflight;
    }

    public void setFlightIdflight(int flightIdflight) {
        this.flightIdflight = flightIdflight;
    }

    public int getStewardIdsteward() {
        return this.stewardIdsteward;
    }

    public void setStewardIdsteward(int stewardIdsteward) {
        this.stewardIdsteward = stewardIdsteward;
    }

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

        return (this.getFlightIdflight() == castOther.getFlightIdflight())
                && (this.getStewardIdsteward() == castOther.getStewardIdsteward());
    }

    public int hashCode() {
        int result = 17;

        result = 37 * result + this.getFlightIdflight();
        result = 37 * result + this.getStewardIdsteward();
        return result;
    }

}

Reader.java(我要读的类):

/* Method to READ all the stewards on specific flight */
public void getStewards(int flightid) {
    Session session = factory.openSession();
    Transaction tx = null;
    try {
        tx = session.beginTransaction();

        // Query query = session
        // .createQuery(" FROM FlightHasSteward as FHS LEFT JOIN FHS.Flight AS F ON F.idFlight = FHS.Flight_idFlight RIGHT JOIN FHS.Steward AS S ON S.idSteward = FHS.Steward_idSteward where FHS.Flight_idFlight = :code");
        Query query = session.createQuery(" FROM FlightHasSteward where Flight_idFlight = :code");
        query.setParameter("code", flightid);
        List<FlightHasStewardId> result = query.list();

        final List<FlightHasStewardId> res = (List<FlightHasStewardId>) query.list();
        for (final FlightHasStewardId hall_calendar : res) {
            System.out.println(hall_calendar.getStewardIdsteward());
        }
        tx.commit();
    } catch (HibernateException e) {
        if (tx != null)
            tx.rollback();
        e.printStackTrace();
    } finally {
        session.close();
    }

}

令人不安的输出:

Exception in thread "main" java.lang.ClassCastException: FlightHasSteward cannot be cast to FlightHasStewardId
    at Reader.getStewards(Reader.java:97)
    at Manager.main(Manager.java:24)

非常感谢您对此案的任何帮助,提前谢谢大家。

最佳答案

您正在从 FlightHasSteward 中进行选择,因此生成的 List 将包含这些类型,而不是 FlightHasStewardId

Query query = session.createQuery(" FROM FlightHasSteward where Flight_idFlight = :code");
query.setParameter("code", flightid);
List<FlightHasSteward> result = query.list();
final List<FlightHasSteward> res = (List<FlightHasSteward>) query.list();
for (final FlightHasSteward steward : res) {
        System.out.println(steward.getId().getStewardIdsteward());
}

关于java - Hibernate 映射复合键 ManyToMany 导致 ClassCastException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20868973/

相关文章:

c# - 如何保护 OAuth key 不被用户反编译我的项目?

java - 为什么最终没有扩展到适用于数组和引用的对象?

java - Hibernate Reference 表中的列指示如何解码同一表中不同列中的属性

c# - LINQ to Entities 中的多对多选择

java - 运行 JSP 的侵入性最小的方式

java - jetty 间歇性崩溃的问题

java - HQL(hibernate) 时间戳范围匹配

hibernate - 如何让 Hibernate 在它创建的表/字段上添加注释

asp.net-mvc-3 - 在多对多关系的情况下坚持使用 asp.net mvc 3.0 脚手架

java - 多对多关系中的Hibernate无限循环递归