Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate映射的复合键多导致ClassCastException_Java_Hibernate_Many To Many_Hql_Classcastexception - Fatal编程技术网

Java Hibernate映射的复合键多导致ClassCastException

Java Hibernate映射的复合键多导致ClassCastException,java,hibernate,many-to-many,hql,classcastexception,Java,Hibernate,Many To Many,Hql,Classcastexception,几个小时以来,我一直在努力解决休眠问题,在任何网站上都找不到任何帮助。我已经阅读了几十篇教程,尝试了所有方法,但最终总是出现类强制转换异常或编译错误 在数据库的这个特定部分(mysql innodb)中,我的模式是Plane和Steward。他们有很多共同的关系 使用Hibernate代码生成和Hibernate工具,我生成了所有POJO类和映射文件(包括FlightHasStewardId和FlightHasSteward->映射复合ID) 我现在想宣读100次航班上所有的乘务员 注意:读取其

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

在数据库的这个特定部分(mysql innodb)中,我的模式是Plane和Steward。他们有很多共同的关系

使用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>
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;
    }

}
java(我要阅读的类):


如果您能在此案例中提供任何帮助,我将不胜感激。您正在从
FlightHasSteward
中进行选择,因此生成的
列表将包含这些类型,而不是
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());
}
Query Query=session.createQuery(“从FlightHasSteward,其中Flight_idFlight=:code”);
query.setParameter(“代码”,flightid);
列表结果=query.List();
final List res=(List)query.List();
适用于(最终航班哈斯特沃德乘务员:res){
System.out.println(steward.getId().getStewardIdsteward());
}

感谢您的快速回复。我试过了,但还是出现了例外。只有当其为FlightHasStewardId时,我才能访问getFlightIdFlight()等方法。如何读取FlightHasSteward而使用ID类?是否将以前出现的
FlightHasStewardId
替换为
FlightHasSteward
(项目清理、重新部署等)请参阅Updated我是否清楚地了解不需要Id类?我可以删除它吗?或者它只是映射所需要的吗?事实上,它可以在基于复合键进行查找时使用。此答案旨在解决
ClassCastException
OMG。我现在明白了整件事(该死,我怎么可能没有看到这件事)。非常感谢你帮我摆脱了假日模式。我想你救了我几个小时!
/* 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)
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());
}