大家好,问各位一个Hibernate中一对多的问题,谢谢!

我的数据库如下:tt_user和room:


if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[tt_user]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[tt_user]
GO

CREATE TABLE [dbo].[tt_user] (
[USER_ID] [int] IDENTITY (1, 1) NOT NULL ,
[NAME] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[ROOM_ID] [int] NULL ,
CONSTRAINT [PK_user] PRIMARY KEY CLUSTERED
(
[USER_ID]
) ON [PRIMARY] ,
CONSTRAINT [FK_tt_user_room] FOREIGN KEY
(
[ROOM_ID]
) REFERENCES [dbo].[room] (
[ROOM_ID]
)
) ON [PRIMARY]
GO


if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[room]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[room]
GO

CREATE TABLE [dbo].[room] (
[ROOM_ID] [int] IDENTITY (1, 1) NOT NULL ,
[ADDRESS] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
CONSTRAINT [PK_room] PRIMARY KEY CLUSTERED
(
[ROOM_ID]
) ON [PRIMARY]
) ON [PRIMARY]
GO
XML文件如下:


<?xml version="1.0"?>
<!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 - Hibernate Tools
-->
<hibernate-mapping>
<class name=
"One_To_Many.Room" table="room"
dynamic-update=
"true"
dynamic-insert=
"true"
schema=
"dbo" catalog="BlogOnline">

<id name=
"id" type="java.lang.Integer" >
<column name=
"ROOM_ID" />
<generator class=
"native"/>
</id>

<property name=
"address" type="java.lang.String">
<column name=
"ADDRESS" length="50" />
</property>

<set name=
"users"
table=
"tt_USER"
lazy=
"false"
inverse=
"true"
cascade=
"all">
<key column=
"ROOM_ID"/>
<one-to-many class=
"One_To_Many.User"/>
</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">
<!--
Mapping file autogenerated by MyEclipse - Hibernate Tools
-->
<hibernate-mapping>
<class name=
"One_To_Many.User" table="tt_user"
dynamic-update=
"false"
dynamic-insert=
"false"

schema=
"dbo" catalog="BlogOnline">
<id name=
"Id" type="java.lang.Integer" >
<column name=
"USER_ID" />
<generator class=
"native" />
</id>
<property name=
"name" type="java.lang.String">
<column name=
"NAME" length="50" />
</property>

<many-to-one name=
"room"

class=
"One_To_Many.Room"
cascade=
"none"
outer-join=
"auto"
update=
"true"
insert=
"true"
access=
"property"
column=
"ROOM_ID"
not-null=
"true"

/>
</class>

</hibernate-mapping>

Java代码如下:


package One_To_Many;

import java.util.HashSet;
import java.util.Set;

public class Room {
private long id;
private String address;
private Set users = new HashSet();
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public Set getUsers() {
return users;
}
public void setUsers(Set users) {
this.users = users;
}


}


package One_To_Many;

public class User {
private long Id;
private String name;
private Room room;


public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Room getRoom() {
return room;
}
public void setRoom(Room room) {
this.room = room;
}
public long getId() {
return Id;
}
public void setId(long id) {
Id = id;
}

}

测试代码如下:


package One_To_Many;

import java.sql.SQLException;

import javax.security.auth.login.Configuration;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;

import test.HibernateSessionFactory;


public class Test {
public static void main(String[] args) throws HibernateException, SQLException {


Session session = HibernateSessionFactory.getSession();
session.connection().setAutoCommit(true);

Room room = new Room();
room.setAddress("China-10-911");

User user1 = new User();

user1.setName(
"ivan");

User user2 = new User();

user2.setName(
"mada");

user1.setRoom(room);
user2.setRoom(room);


room.getUsers().add(user1);
room.getUsers().add(user2);


Transaction tx= (Transaction) session.beginTransaction();

session.save(room);

tx.commit();

session.close();
System.out.println(
"transaction ends");


}
}

出现的错误如下:


Exception in thread "main" org.hibernate.HibernateException: identifier of an instance of One_To_Many.Room was altered from 9 to 9
at org.hibernate.event.def.DefaultFlushEntityEventListener.checkId(DefaultFlushEntityEventListener.java:51)
at org.hibernate.event.def.DefaultFlushEntityEventListener.getValues(DefaultFlushEntityEventListener.java:150)
at org.hibernate.event.def.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:106)
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 One_To_Many.Test.main(Test.java:45)

其中,我测试一次,from to 就增加一,我测试了九次,所以九有from 9 to 9!我刚学习hibernate不久,恳求banq和各位帮助一下,不胜感谢!
关键是映射配置,你的配置好像不太简洁,使用Hiebrnate3缺省机制,不要用太多定制语法,例如 lazy="false"就不用设置,缺省是true,贴个简单的配置给你看:



<hibernate-mapping>
<class name="sample.model.User" table="testuser">
<id name=
"userId" type="java.lang.String" >
<generator class=
"assigned"/>
</id>
<property name=
"username" type="java.lang.String">
<column name=
"name" />
</property>
<many-to-one cascade=
"save-update" name="dept" class="sample.model.Dept" column="categoryId" />
<bag name=
"userProps" inverse="true" cascade="all" >
<key column=
"userId" />
<one-to-many class=
"sample.model.UserProperty" />
</bag>
</class>

<class name=
"sample.model.UserProperty" table="userprops">
<id name=
"propId" type="java.lang.String" >
<generator class=
"uuid.hex"/>
</id>
<property name=
"name" />
<property name=
"value" />
<many-to-one name=
"user" column="userId" not-null="true"/>
</class>


</hibernate-mapping>