我用SQL server 2008建了三个表,其中VoteTheme的主键作为VoteOption的外键,
现在新建一个VoteTheme,再新建2个VoteOption并通过setter方法使得2个VoteOption的集合成为前面新建的VoteTheme的set集合属性,如果保存VoteTheme对象的话,则会出现如下错误:
Hibernate: select member0_.ID as ID0_0_, member0_.MemberName as MemberName0_0_, member0_.Pwd as Pwd0_0_, member0_.Sex as Sex0_0_, member0_.MailBox as MailBox0_0_, member0_.MemberType as MemberType0_0_ from VotingSystem.dbo.Member member0_ where member0_.ID=?
Hibernate: insert into VotingSystem.dbo.VoteTheme (ThemeName, ThemeContent, ThemeStatus, Creator) values (?, ?, ?, ?)
Hibernate: insert into VotingSystem.dbo.VoteOption (OptionName, OptionContent, themeID) values (?, ?, ?)
2013-5-4 15:51:52 org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
WARN: SQL Error: 515, SQLState: 23000
2013-5-4 15:51:52 org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
ERROR: 不能将值 NULL 插入列 'ThemeID',表 'VotingSystem.dbo.VoteOption';列不允许有 Null 值。INSERT 失败。数据库:
create table Member(
ID int identity(1000,1) primary key,
MemberName varchar(20) not null,
Pwd varchar(20) not null,
Sex varchar(2) not null,
MailBox varchar(32) not null,
MemberType varchar(6) default 'normal' not null check (MemberType in ('normal','admin'))
);
create table VoteTheme(
ThemeID int identity(1000,1) primary key,
ThemeName varchar(50) not null,
ThemeContent varchar(200) not null,
Creator int not null,
ThemeStatus int default 0 not null,
foreign key (Creator) references Member(ID)
);
create table VoteOption(
OptionID int identity(10000,1) primary key,
OptionName varchar(50) not null,
OptionContent varchar(200) not null,
ThemeID int not null,
Votes int default 0 not null
foreign key (ThemeID) references VoteTheme(ThemeID)
);VoteTheme类:
public class VoteTheme {
private int themeID;
private String themeName;
private String themeContent;
private Member member;
private int themeStatus;
private Set<VoteOption> options = new HashSet<VoteOption>();
        //省略构造和getter、setter方法配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><hibernate-mapping>
<class name="vote.entity.VoteTheme" table="VoteTheme" catalog="VotingSystem"
schema="dbo">
<id name="themeID" type="java.lang.Integer">
<column name="ThemeID"></column>
<generator class="native"></generator>
</id>
<property name="themeName" type="java.lang.String">
<column name="ThemeName" length="50"></column>
</property>
<property name="themeContent" type="java.lang.String">
<column name="ThemeContent" length="200"></column>
</property>
<property name="themeStatus" type="java.lang.Integer">
<column name="ThemeStatus"></column>
</property>
<many-to-one name="member" column="Creator"></many-to-one>
<set name="options" table="VoteOption" cascade="save-update" fetch="select" >
<key>
<column name="ThemeID" not-null="true"></column>
</key>
<one-to-many class="vote.entity.VoteOption"  />
</set>
</class>
</hibernate-mapping>VoteOption类:
public class VoteOption {
private int optionID;
private String optionName;
private String optionContent;
private VoteTheme voteTheme;
private int votes;
        //省略构造和getter、setter方法<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><hibernate-mapping>
<class name="vote.entity.VoteOption" table="VoteOption"
catalog="VotingSystem" schema="dbo">
<id name="optionID" type="java.lang.Integer">
<column name="OptionID"></column>
<generator class="native"></generator>
</id>
<property name="optionName" type="java.lang.String">
<column name="OptionName" length="50"></column>
</property>
<property name="optionContent" type="java.lang.String">
<column name="OptionContent" length="200"></column>
</property>
<property name="votes" generated="insert" type="java.lang.Integer">
<column name="Votes"></column>
</property>
<many-to-one name="voteTheme" column="themeID"></many-to-one>
</class>
</hibernate-mapping>