0

私の問題を助けてください.. methodgetDriversByBus(Bus bus)を使用すると、マッピングに問題があります。

モデル: バス bus_id pk 番号

ドライバー driver_id pk 名

busdriver bus_id fk driver_id fk

バス

public class Bus {
    private Long id;
    private String number;
    private Set drivers = new HashSet();

    public Bus(){

    }

    public Long getId() {
        return id;
    }

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

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number;
    }

    public Set getDrivers() {
        return drivers;
    }

    public void setDrivers(Set drivers) {
        this.drivers = drivers;
    }



}

運転者

public class Driver {
    private Long id;
    private String name;
    private Set busses = new HashSet();

    public Driver(){

    }

    public Long getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Set getBusses() {
        return busses;
    }

    public void setBusses(Set busses) {
        this.busses = busses;
    }


}

1 クラス - ドライバー:

public class DriverDAOImpl implements DriverDAO{

@Override
public void addDriver(Driver driver) throws SQLException {
    // TODO Auto-generated method stub
    Session session = null;
    try {
        session = HibernateUtil.getSessionFactory().openSession();
        session.beginTransaction();
        session.save(driver);
        session.getTransaction().commit();


    } catch (Exception e) {
        // TODO: handle exception
        e.printStackTrace();
        JOptionPane.showMessageDialog(null, e.getMessage(), "Ошибка при вставке", JOptionPane.OK_OPTION);
    }

}

@Override
public Collection getAllDrivers() throws SQLException {
    // TODO Auto-generated method stub
    return null;
}

@Override
public Collection getDriversByBus(Bus bus) throws SQLException {
    // TODO Auto-generated method stub
    Session session = null;
    List drivers = new ArrayList<Driver>();
    try {
        session = HibernateUtil.getSessionFactory().openSession();
        session.beginTransaction();
        Long bus_id = bus.getId();

        Query query = session.createQuery("select d"+
                " from com.ee.model.Driver d JOIN d.busses bus"
                + " where bus.id =:busid ").setLong("busid", bus_id);




        drivers = (List<Driver>)query.list();
        session.getTransaction().commit();



    } catch (Exception e) {
        // TODO: handle exception
        e.printStackTrace();
    }

    finally{
        if(session!=null && session.isOpen()){
            session.close();
        }
    }
    return drivers;
}
}

2 クラス - バス パブリック クラス BusDAOImpl は BusDAO を実装します {

@Override
public void addBus(Bus bus) throws SQLException {
    // TODO Auto-generated method stub

      Session session = null;
        try {
          session = HibernateUtil.getSessionFactory().openSession();
          session.beginTransaction();
          session.save(bus);
          session.getTransaction().commit();
        } catch (Exception e) {
            e.printStackTrace();
          JOptionPane.showMessageDialog(null, e.getMessage(), "Ошибка при вставке", JOptionPane.OK_OPTION);
        } finally {
          if (session != null && session.isOpen()) {

            session.close();
          }
        }
      }


@Override
public Collection getAllBusses() throws SQLException {
    // TODO Auto-generated method stub
       Session session = null;
        List busses = new ArrayList<Bus>();
        try {
          session = HibernateUtil.getSessionFactory().openSession();
          busses = session.createCriteria(Bus.class).list();
        } catch (Exception e) {
            e.printStackTrace();
          JOptionPane.showMessageDialog(null, e.getMessage(), "Ошибка 'getAll'", JOptionPane.OK_OPTION);
        } finally {
          if (session != null && session.isOpen()) {
            session.close();
          }
        }
        return busses;
      }


@Override
public Collection getDriverByBus(Driver driver) throws SQLException {
    // TODO Auto-generated method stub
    Session session = null;
    List busses = new ArrayList<Bus>();
    try {
        session = HibernateUtil.getSessionFactory().openSession();
        session.beginTransaction();
        Long driver_id = driver.getId();
        Query query = session.createQuery("select b "+ 
        "from Bus b INNER JOIN b.drivers driver"+
                " where driver.id =:driverid ").setLong("driverid", driver_id);
        busses = (List<Bus>)query.list();
        session.getTransaction().commit();



    } catch (Exception e) {
        // TODO: handle exception
    }
    finally{
        if(session!=null && session.isOpen()){
            session.close();
        }
    }

    return busses;
}

}

私のマッピング:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 22.02.2013 19:34:10 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
    <class name="com.ee.model.Bus" table="busses">
        <id name="id" type="java.lang.Long">
            <column name="bus_id" />
            <generator class="increment" />
        </id>
        <property name="number" type="java.lang.String">
            <column name="NUMBER" />
        </property>
        <set name="drivers" table="busdriver" inverse="false" lazy="false">
            <key>
                <column name="bus_id" />
            </key>
            <many-to-many column="driver_id" class="com.ee.model.Driver"></many-to-many>
        </set>
    </class>
</hibernate-mapping>


<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 22.02.2013 19:34:20 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
    <class name="com.ee.model.Driver" table="drivers">
        <id name="id" type="java.lang.Long">
            <column name="driver_id" />
            <generator class="increment" />
        </id>
        <property name="name" type="java.lang.String">
            <column name="NAME" />
        </property>
        <set name="busses" table="busdriver" inverse="false" lazy="false">
            <key>
                <column name="driver_id" />
            </key>
            <many-to-many column="bus_id" class="com.ee.model.Bus"></many-to-many>

        </set>
    </class>
</hibernate-mapping>

メインクラス:

public class EEMain {

    /**
     * @param args
     */
public static void main(String[] args) throws SQLException{
    // TODO Auto-generated method stub



    Collection busses = Factory.getInstance().getBusDAO().getAllBusses();
    Iterator iter = busses.iterator();
    System.out.println("All busses");
    while(iter.hasNext()){
        Bus bus = (Bus) iter.next();
        Collection drivers = Factory.getInstance().getDriverDAO().getDriversByBus(bus);
        Iterator itr2 = drivers.iterator();
        System.out.println("Bus # " + bus.getNumber());
        while (itr2.hasNext()){
            Driver driver =  (Driver) itr2.next();
            System.out.println("Name: "+ driver.getName());
        }
    }



}

}

hibernate.cfg

 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory name="ee">
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://127.0.0.1/mydb</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="connection.pool_size">1</property>
    <property name="current_session_context_class">thread</property>
    <property name="show_sql">true</property>
    <mapping resource="com/ee/model/Driver.hbm.xml"/>
    <mapping resource="com/ee/model/Bus.hbm.xml"/>
    </session-factory>
     </hibernate-configuration>

工場

public class Factory {
    private static BusDAO busDAO = null;
    private static DriverDAO driverDAO = null;
    private static Factory instance = null;

     public static synchronized Factory getInstance(){
            if (instance == null){
              instance = new Factory();
            }
            return instance;
          }


      public BusDAO getBusDAO(){
        if (busDAO == null){
          busDAO = new BusDAOImpl();
        }
        return busDAO;
      }

      public DriverDAO getDriverDAO(){
        if (driverDAO == null){
          driverDAO = new DriverDAOImpl();
        }
        return driverDAO;
      }

}

HibernateUtil:

public class HibernateUtil {
      private static final SessionFactory sessionFactory;
        static {
          try {
            sessionFactory = new Configuration().configure().buildSessionFactory();
          } catch (Throwable ex) {
            System.err.println("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
          }
        }

        public static SessionFactory getSessionFactory() {
          return sessionFactory;
        }
    }

エラー テキスト:

log4j:WARN ロガー (org.jboss.logging) のアペンダーが見つかりませんでした。
log4j:WARN log4j システムを適切に初期化してください。
Hibernate: busses this_ から this_.bus_id を bus1_2_0_ として、this_.NUMBER を NUMBER2_0_ として選択します。
ハイバネート: driver0_.bus_id を bus2_2_1_ として、drivers0_.driver_id を driver1_1_1_ として、driver1_.driver_id を driver1_0_0_ として、driver1_.NAME を NAME0_0_ として選択します。
ハイバネート: busses0_.driver_id を driver1_0_1_ として、busses0_.bus_id を bus2_1_1_ として、bus1_.bus_id を bus1_2_0_ として、bus1_.NUMBER を NUMBER2_0_ として選択します。
すべてのバス
org.hibernate.hql.internal.ast.QuerySyntaxException: ドライバーがマップされていません [ドライバー d から d を選択し、バス b ここで d.id = b.id および b.id =: バス ID]
バス#10
    org.hibernate.hql.internal.ast.util.SessionFactoryHelper.requireClassPersister (SessionFactoryHelper.java:180) で
    org.hibernate.hql.internal.ast.tree.FromElementFactory.addFromElement (FromElementFactory.java:110) で
    org.hibernate.hql.internal.ast.tree.FromClause.addFromElement (FromClause.java:93) で
    org.hibernate.hql.internal.ast.HqlSqlWalker.createFromElement (HqlSqlWalker.java:324) で
    org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromElement (HqlSqlBaseWalker.java:3291) で
    org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromElementList (HqlSqlBaseWalker.java:3180) で
    org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromClause (HqlSqlBaseWalker.java:706) で
    org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.query (HqlSqlBaseWalker.java:562) で
    org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectStatement (HqlSqlBaseWalker.java:299) で
    org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.statement (HqlSqlBaseWalker.java:247) で
    org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze (QueryTranslatorImpl.java:248) で
    org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile (QueryTranslatorImpl.java:183) で
    org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile (QueryTranslatorImpl.java:136) で
    org.hibernate.engine.query.spi.HQLQueryPlan.(HQLQueryPlan.java:105) で
    org.hibernate.engine.query.spi.HQLQueryPlan.(HQLQueryPlan.java:80) で
    org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:168) で
    org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan (AbstractSessionImpl.java:221) で
    org.hibernate.internal.AbstractSessionImpl.createQuery (AbstractSessionImpl.java:199) で
    org.hibernate.internal.SessionImpl.createQuery (SessionImpl.java:1735) で
    com.ee.DAO.DriverDAOImpl.getDriversByBus (DriverDAOImpl.java:59) で
    com.ee.EEMain.main (EEMain.java:36) で

4

2 に答える 2

0

mode.Driver と model.Driver の間に混同があるように見えます。Hibernate から生成された SQL とエラー メッセージは com.ee.mode.Driver について述べていますが、上記のほとんどのマッピングとコードには com.ee.model.Driver があります。

上記のコードにエラーが表示されません。Java にある場合はおそらくコンパイルされないため、構成が上記の質問のマッピング ファイルよりも古いマッピング ファイルを取得していると思われますが、これは修正されています。

私が思う本当の問題は、Hibernate が Bus クラスで「drivers」という名前のセットを探していることです。Bus クラスのコードは上記に含まれていないと思いますが、それが問題の核心にあると思います。たぶん、名前が間違っているか、何かがあります。次のようになります。

public class Bus {
private int id;
// Blah blah
private Set drivers;
// blah 
}
于 2013-02-23T13:18:17.960 に答える
0

問題の原因を特定してみましょう。セットを非遅延として宣言しているためです。bus.getDrivers() Set を反復しようとすると、何がわかりますか?

于 2013-02-23T13:55:41.217 に答える