修改后输出结果还是更新: 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=?
去掉上面两句后,输出结果如下: 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)
<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 去掉 配置文件 最好不要自动生成
楼主你理解有误,和你配置文件没有关系,是你代码写的有问题. 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赋值给主表的属性就可以了. 以上代码我没有试运行,现在机器没有环境,楼主可以测试下.有问题留言.
有问题:你看一下测试结果吧:(还是更新) 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=?
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=?
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=?
people.setRoom(room);
people1.setRoom(room);
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)
<key>
<column name="room_id" not-null="true"/>
</key>
<one-to-many class="com.vo.People" />
< t>
去掉
private Set peoples=new HashSet(); get set
去掉
配置文件 最好不要自动生成
保存修改 保存people实例
第二、如果去掉配置文件也去掉,Hibernate不报错吗?
第三,如果要配置文件的话<set name="peoples" lazy="true" inverse="true" cascade="all"> ,这句话描述的peoples,不在实体类中实现,真的可以吗?
第一、配置文件不是自动生成的,是我自已手写的。
第二、如果去掉配置文件也去掉,Hibernate不报错吗?
第三,如果要配置文件的话 <set name="peoples" lazy="true" inverse="true" cascade="all"> ,这句话描述的peoples,不在实体类中实现,真的可以吗?
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赋值给主表的属性就可以了.
以上代码我没有试运行,现在机器没有环境,楼主可以测试下.有问题留言.
有问题:你看一下测试结果吧:(还是更新)
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=?
<key>
<column name="room_id" not-null="true"/>
</key>
<one-to-many class="com.vo.People" />
<set>是不是应该把 inverse="true" 改成 inverse="false"
cascade:操作上的连锁反应,执行更新操作,维护与主表的关联关系.
还有最好设个ID,名字是不能用来当主键的
删除了呀?这是我修改后的源代码
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=?
问题解决,确实是从表主键问题,主键生成方式改为assigned,即可正常插入,谢谢