私の問題を助けてください.. 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) で