import java.util.Iterator;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import hib.po.Message; 
public class Testms {
public static void main(String[] args) {
SessionFactory sf = new Configuration().configure()
.buildSessionFactory();
Session session = sf.openSession();
session.beginTransaction();
Query query = session
.createQuery("FROM Message m  WHERE m.userinfo.id=1 ");
List<Message> list = query.list();// 这行抛出的异常
Iterator<Message> it = list.iterator();
while (it.hasNext()) {
Message m = it.next();
System.out.println(m.getUserinfo());
System.out.println(m.getTitle());
System.out.println(m.getContent());
}
session.close();
}
}我是从从表里查询,表里有Id相同的数据也就是有数据时会报异常Exception in thread "main" java.lang.NullPointerException
at org.hibernate.tuple.AbstractEntityTuplizer.createProxy(AbstractEntityTuplizer.java:372)
at org.hibernate.persister.entity.AbstractEntityPersister.createProxy(AbstractEntityPersister.java:3121)
at org.hibernate.event.def.DefaultLoadEventListener.createProxyIfNecessary(DefaultLoadEventListener.java:232)
at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:173)
at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:87)
at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:862)
at org.hibernate.impl.SessionImpl.internalLoad(SessionImpl.java:830)
at org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:266)
at org.hibernate.type.EntityType.resolve(EntityType.java:303)
at org.hibernate.engine.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:116)
at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:842)
at org.hibernate.loader.Loader.doQuery(Loader.java:717)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
at org.hibernate.loader.Loader.doList(Loader.java:2145)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2029)
at org.hibernate.loader.Loader.list(Loader.java:2024)
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:375)
at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:308)
at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:153)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1106)
at org.hibernate.impl.QueryImpl.list(QueryImpl.java:79)
at com.test.action.Testms.main(Testms.java:33)没有数据就不会报(当然我要查出有数据的了)如果把Message.hbm.xml里的        
<many-to-one name="userinfo" class="hib.po.Userinfo" cascade="all" fetch="select">
<column name="user_id" />
</many-to-one>
这些删掉 再把查询语句改为
Query query = session
.createQuery("FROM Message where user_id=1 ");
这样不会报错可以查出数据 可是这样也就没意义了不是多表又不是级联而且影响到其他功能(保存删除等)有高手帮我解决这个问题吗,困扰了多时---------------------------------------下面是相关的hbm
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="hib.po.Userinfo" table="userinfo" >
        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="increment" />
        </id>
        <property name="name" type="java.lang.String">
            <column name="name" length="32" not-null="true" unique="true" />
        </property>
        <property name="password" type="java.lang.String">
            <column name="password" length="32" not-null="true" />
        </property>
        <property name="pubdate" type="java.util.Date">
            <column name="pubdate" length="19" />
        </property>
        <set name="messages" inverse="true" cascade="save-update" lazy="false">
            <key>
                <column name="user_id" />
            </key>
            <one-to-many class="hib.po.Message" />
        </set>
    </class>
</hibernate-mapping>
--------------------------
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="hib.po.Message" table="message" >
        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="increment" />
        </id>
        <many-to-one name="userinfo" class="hib.po.Userinfo" cascade="all" fetch="select">
            <column name="user_id" />
        </many-to-one>
        <property name="title" type="java.lang.String">
            <column name="title" length="32" not-null="true" />
        </property>
        <property name="content" type="java.lang.String">
            <column name="content" length="2000" />
        </property>
        <property name="pubdate" type="java.util.Date">
            <column name="pubdate" length="19" />
        </property>
        <set name="replymessages" inverse="true" cascade="save-update" lazy="false">
            <key>
                <column name="message_id" />
            </key>
            <one-to-many class="hib.po.Replymessage" />
        </set>
    </class>
</hibernate-mapping>

解决方案 »

  1.   

    <many-to-one name="userinfo" class="hib.po.Userinfo" cascade="all" fetch="join"> 
    <column name="user_id" /> 
    </many-to-one> 
    该为join
      

  2.   

    改为join内连接还是报那个异常 怎么办 不过谢谢你
      

  3.   

    改为join内连接还是报那个异常 怎么办 不过谢谢你
      

  4.   

    SessionFactory sf = new Configuration().configure() 
    .buildSessionFactory(); 
    是不是configure(没有放xml路径),这是自己写的,还是自动生成。 
      

  5.   

    没有自己写也没生成的 就是加包new的
    用写么?我单独测试 我是ssh框架做的高手给能给点提示么?
      

  6.   

    没有自己写也没生成的 就是加包new的
    用写么?我单独测试 我是ssh框架做的高手给能给点提示么?
      

  7.   

    configure(应该有hibernate.xml的路径啊),你加了试试看吧
      

  8.   

    从表也要在many to one 里加上lazy=false
    呵呵 这个问题已经解决了<many-to-one name="userinfo" class="hib.po.Userinfo" cascade="all" fetch="select" lazy="false">  
                <column name="user_id" />