<set name="peoples" lazy="true" inverse="false" cascade="all"> 

解决方案 »

  1.   

    修改后输出结果还是更新:
    Hibernate: select max(room_id) from room
    Hibernate: insert into room (room_name, room_id) values (?, ?)
    Hibernate: update People set sex=?, room_id=? where username=?
    Hibernate: update People set sex=?, room_id=? where username=?
    Hibernate: update People set room_id=? where username=?
    Hibernate: update People set room_id=? where username=?
      

  2.   

    原来配置不变,下面两行注释掉
    people.setRoom(room); 
    people1.setRoom(room); 
      

  3.   

     去掉上面两句后,输出结果如下:
    Hibernate: select max(room_id) from room
    Exception in thread "main" org.hibernate.PropertyValueException: not-null property references a null or transient value: com.vo.People.room
    at org.hibernate.engine.Nullability.checkNullability(Nullability.java:72)
    at org.hibernate.event.def.DefaultFlushEntityEventListener.scheduleUpdate(DefaultFlushEntityEventListener.java:256)
    at org.hibernate.event.def.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:114)
    at org.hibernate.event.def.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:195)
    at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:76)
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:26)
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:985)
    at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:333)
    at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
    at com.dao.RoomDAO.addRoom(RoomDAO.java:23)
    at com.example.Example.main(Example.java:33)
      

  4.   

    <set name="peoples" lazy="true" inverse="true" cascade="all"> 
    <key> 
    <column name="room_id" not-null="true"/> 
    </key> 
    <one-to-many class="com.vo.People" /> 
    < t> 
    去掉
    private Set peoples=new HashSet();  get set
    去掉
    配置文件 最好不要自动生成
      

  5.   

    Main函数 
    保存修改 保存people实例
      

  6.   

    第一、配置文件不是自动生成的,是我自已手写的。
    第二、如果去掉配置文件也去掉,Hibernate不报错吗?
    第三,如果要配置文件的话<set name="peoples" lazy="true" inverse="true" cascade="all"> ,这句话描述的peoples,不在实体类中实现,真的可以吗?
      

  7.   


    第一、配置文件不是自动生成的,是我自已手写的。 
    第二、如果去掉配置文件也去掉,Hibernate不报错吗? 
    第三,如果要配置文件的话 <set name="peoples" lazy="true" inverse="true" cascade="all"> ,这句话描述的peoples,不在实体类中实现,真的可以吗? 
      

  8.   

    cascade=none 这个是不级联操作 你all了所有操作都级联了
      

  9.   

    楼主你理解有误,和你配置文件没有关系,是你代码写的有问题.
    Main函数 
    RoomDAO dao=new RoomDAO(); Room room=new Room(); 
    room.setRoom_name("a"); People people=new People(); 
    people.setUsername("mary"); 
    people.setSex("woman"); People people1=new People(); 
    people1.setUsername(""); 
    people1.setSex("man"); room.getPeoples().add(people); 
    room.getPeoples().add(people1); 
    修改为Set set = new HashSet();
    set.add(people);
    set.add(people1);
    room.setPeoples(set);people.setRoom(room); 
    people1.setRoom(room);
     
    dao.addRoom(room); 你要做的是向主表添加一条记录,级联向从表添加,那么你是对主表进行操作,你配置了级联后,只需要把从表组成的Set赋值给主表的属性就可以了.
    以上代码我没有试运行,现在机器没有环境,楼主可以测试下.有问题留言.
      

  10.   


    有问题:你看一下测试结果吧:(还是更新)
    log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment).
    log4j:WARN Please initialize the log4j system properly.
    Hibernate: select max(room_id) from room
    Hibernate: insert into room (room_name, room_id) values (?, ?)
    Hibernate: update People set sex=?, room_id=? where username=?
    Hibernate: update People set sex=?, room_id=? where username=?
      

  11.   

    <set name="peoples" lazy="true" inverse="true" cascade="all"> 
    <key> 
    <column name="room_id" not-null="true"/> 
    </key> 
    <one-to-many class="com.vo.People" /> 
    <set>是不是应该把 inverse="true" 改成 inverse="false"
      

  12.   

     inverse:主要用在一对多和多对多双向关联上.是关联关系的维护方向
    cascade:操作上的连锁反应,执行更新操作,维护与主表的关联关系.
      

  13.   

    楼主是你的主键设置问题,既然你生成方式设成native,为什么你代码里还要给people指定主键呢?把<generator class="native"/> 改成<generator class="assigned"/> 
    还有最好设个ID,名字是不能用来当主键的
      

  14.   


    删除了呀?这是我修改后的源代码
                      RoomDAO dao=new RoomDAO(); 

    Room room=new Room();
    room.setRoom_name("a");


    People people=new People();
    people.setUsername("mary");
    people.setSex("woman");

    People people1=new People();
    people1.setUsername("");
    people1.setSex("man");

    Set peoples=new HashSet();
    peoples.add(people);
    peoples.add(people1);

    room.setPeoples(peoples);
    people.setRoom(room);
    people1.setRoom(room);
    dao.addRoom(room);运行结果为:
    log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment).
    log4j:WARN Please initialize the log4j system properly.
    Hibernate: select max(room_id) from room
    Hibernate: insert into room (room_name, room_id) values (?, ?)
    Hibernate: update People set sex=?, room_id=? where username=?
    Hibernate: update People set sex=?, room_id=? where username=?
      

  15.   


    问题解决,确实是从表主键问题,主键生成方式改为assigned,即可正常插入,谢谢