大家好,今天学习hibernate 用的是一对多是自身的映射的
插入,单个查询都没问题,可等查询列表的时候出问题表查出来的数据其它字段都有值只有id全是0不知道为什么?
这个是model类
public class Menu { private long id;
private String name;
private String url;
private Menu menu;
private Set<Menu>child = new HashSet<Menu>();
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}

public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public Menu getMenu() {
return menu;
}
public void setMenu(Menu menu) {
this.menu = menu;
}
public Set<Menu> getChild() {
return child;
}
public void setChild(Set<Menu> child) {
this.child = child;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}   这个 是hbm.xml文件
    <hibernate-mapping>   <class name="com.test.hailang.model.Menu" table="j_menu">
    
     <id column="id" type="long">
     <generator class="increment"></generator>
     </id>
     <property name="name" type="string"></property>
     <property name="url" type="string"></property>
     <set name="child" cascade="all" inverse="true">
        <key column="pid"></key>
        <one-to-many class="com.test.hailang.model.Menu"/>
     </set>
      <many-to-one name="menu" column="pid" class="com.test.hailang.model.Menu">
       </many-to-one>   
   </class></hibernate-mapping>
向表中插入数据
                Menu menu = new Menu();
                menu.setName("first");
menu.setUrl("163.com");
Menu m1 = new Menu();
m1.setName("second");
m1.setUrl("126.com");
menu.getChild().add(m1);
m1.setMenu(menu);
Menu menu2  = new Menu();
menu2.setName("third");
menu2.setUrl("sina");
menu.getChild().add(menu2);
menu2.setMenu(menu);数据库中的数据
id      name     url     pid
1 first 163.com  null
2 second 126.com  1
3 third sina  1这个是查询方法的代码Transaction trance = session.beginTransaction();
List<Menu> list = null;
Query query=session.createQuery("from  Menu");
List l1 = query.list();
list =(List<Menu>) query.list();当我循环list的时候取别的字段都没问题只有当menu.getId()的时候全是0不知道为什么,有知道的朋友请指点下谢谢了!!!

解决方案 »

  1.   

    把主键生成方式改为identity或者你的操作表的主键没有被设置为自动增长。
    hbm.xml
    <id column="id" type="long">
      <generator class="increment"></generator>
      </id>
      

  2.   

    这个是为什么那?能解释下么?我用的是oracle数据库
      

  3.   

    <generator class="increment"></generator>
    这里是设置你主键是什么类型的,是自增的还是什么类型!你先看看你数据库表主键是什么类型的,然后这里设置成什么类型的就行
    如果是orcal类型的话
    改成sequence 只适用于Oracle 
    <id name="id" column="id"> 
    <generator class="sequence"> 
    <param name="sequence">person_seq</param><!--指定sequence名--> 
    </generator> 
    </id> 
    hibernate generator class""详解 (转) 
      

  4.   

    我已经改成<id name="id" column="id">  
    <generator class="sequence">  
    <param name="sequence">person_seq</param><!--指定sequence名-->  
    </generator>  
    </id>  了 插入数据没问题
    查询数据还是一样查询出来的list中的menu.getid()还是0其它值没问题 
    问题依旧啊 呜呜呜。急啊弄了一天了 也百不到东西
      

  5.   

    Hibernate: select menu0_.id as id0_, menu0_.name as name0_, menu0_.url as url0_, menu0_.pid as pid0_ from j_menu menu0_
    这个是hibernate生成的sql语句 我放到数据库查询里面有id啊,不明白为什么会这样
    0   first
    0   third
    0   second这我只输出了menu.getId() 和menu.getName()
      

  6.   

    我已经改成<id name="id" column="id">   
    <generator class="sequence">   
    <param name="sequence">person_seq</param><!--指定sequence名-->   
    </generator>   
    </id>
    这样还是不行么?
    怎么才能匹配上那?
      

  7.   

    native
    identity
    试试这两个
      

  8.   

    我是数据库是oracle的自增长在hbm.xml文件中设置了啊 而且插入数据时id能正常插入
    我要是单独查询id也是正常的就是查询出所有的以列表形式返回时列表中的每个对象的id就都变成0了不知道为什么。
      

  9.   

    不是hbm文件而是你数据库中主键是不是自动增长的,这很关键,这关系到下面你要设置什么类型
    <generator class="">   
    <param name=""></param><!--指定sequence名-->   
    </generator> 
      

  10.   

    这个是我在hbm.xml中设置的 <id column="id" type="long">
         <generator class="sequence" >
           <param name="sequence">HAILANG.MENU_ID</param>
         </generator>
         </id>
    我用的是oracle数据库列没有自增长的自属性,只能靠sequence 我在数据库建了HAILANG.MENU_ID这个用来自增长是没问题的我试了
      

  11.   

    native
    identity
    你先用用这两个,看行不行
      

  12.   

    <id name="id" type="java.lang.Integer">
       <column name="id" precision="6" scale="0"/>
       <generator class="sequence">     <!--在ORCAL中生在器的类型用SEQUENCE--> <!--配置生在器的参数,在hibernate中默认的ORCAL的序列名字为hibernate_sequence,所以在此处要修改为你在ORCAL中创建的序列名seq_userinfo_id-->
        <param name="sequence">seq_userinfo_id</param>
       </generator>
      </id>
    我觉得是这里的问题,你再试试看吧,你在查询列表的时候是怎么读的,代码帖出来我也看看吧,清下项目缓存!
      

  13.   

    Hibernate: select menu0_.id as id0_, menu0_.name as name0_, menu0_.url as url0_, menu0_.pid as pid0_ from j_menu menu0_
    这个是hibernate生成的sql语句
    怎么清项目缓存啊?
      

  14.   

    你是MyE还是Ec啊,直接百度就行,看语句是没有问题的把语句复制到数据库执行一下,如果没有问,我觉得就是配置问题,你在看看我给你发的那个配置
      

  15.   

    session.createQuery("from Menu ").list();  你在试试这样