知识大全 Hibernate单向一对多注意的问题

Posted 语句

篇首语:逆水行舟用力撑,一篙松劲退千寻。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Hibernate单向一对多注意的问题相关的知识,希望对你有一定的参考价值。

Hibernate单向一对多注意的问题  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  这个 问题困扰我 多天 终于干掉了

  本人使用myeclipse ga 进行hibernate一对多单向关联实例

  一直报如下异常

  Hibernate:

  insert

  into

  hbql score

  (score type)

  values

  

   : : DEBUG JDBCExceptionReporter: could not insert: [score Score] [insert into hbql score (score type) values (? ?)]

  java sql SQLException: Field sid doesn t have a default value

  at mysql jdbc SQLError createSQLException(SQLError java: )

   //太长发不了 省略点

   : :  WARN JDBCExceptionReporter: SQL Error: SQLState: HY

   : : ERROR JDBCExceptionReporter: Field sid doesn t have a default value

  保存对象student Student失败!

   : : DEBUG JDBCTransaction: rollback

   hibernate exception GenericJDBCException: could not insert: [score Score]

  at hibernate exception SQLStateConverter handledNonSpecificException(SQLStateConverter java: )

  at hibernate exception Snvert(SQLStateConverter java: )

   //太长发不了 省略点

  Caused by: java sql SQLException: Field sid doesn t have a default value

  at mysql jdbc SQLError createSQLException(SQLError java: )

  测试程序如下

  Student student=new Student( huizhi );

  Score score =new Score( );

  Score score =new Score( );

  Set set=new HashSet();

  set add(score );

  set add(score );

  student setScores(set);

  saveObject(student);

  printStudents();

  

  映射文件Student hbm xml

  <?xml version= encoding= utf ?>

  <!DOCTYPE hibernate mapping PUBLIC //Hibernate/Hibernate Mapping DTD //EN

   hiber/hibernate mapping dtd >

  <hibernate mapping>

  <class name= student Student table= student catalog= hbql >

  <id name= id type= java lang Integer >

  <column name= id />

  <generator class= native />

  </id>

  <set name= scores table= score cascade= save update inverse= false >

  <key>

  <column name= sid not null= true />

  </key>

  <one to many class= score Score />

  </set>

  <property name= name type= java lang String >

  <column name= name length= not null= true />

  </property>

  <property name= number type= java lang String >

  <column name= number length= not null= true />

  </property>

  <property name= classid type= java lang Integer >

  <column name= classid not null= true />

  </property>

  </class>

  </hibernate mapping>

  

  映射文件Score hbm xml

  <?xml version= encoding= utf ?>

  <!DOCTYPE hibernate mapping PUBLIC //Hibernate/Hibernate Mapping DTD //EN

   hiber/hibernate mapping dtd >

  <hibernate mapping>

  <class name= score Score table= score catalog= hbql >

  <id name= id type= java lang Integer >

  <column name= id />

  <generator class= native />

  </id>

  <property name= score type= java lang Integer >

  <column name= score not null= true />

  </property>

  <property name= type type= java lang String >

  <column name= type length= not null= true />

  </property>

  </class>

  </hibernate mapping>

  

  持久化类

  public class Score implements java io Serializable

  private Integer id;

  private Integer score;

  private String type;

  …

  public class Student implements java io Serializable

  private Integer id;

  private String name;

  private String number;

  private Integer classid;

  private Set scores=new HashSet();

  …

  

  数据库表MySQL

  DROP TABLE IF EXISTS `hbql` `student`;

  CREATE TABLE `hbql` `student` (

  `id` int( ) unsigned NOT NULL auto_increment

  `name` varchar( ) NOT NULL

  `number` varchar( ) NOT NULL

  `classid` int( ) unsigned NOT NULL

  PRIMARY KEY (`id`)

  ) ENGINE=InnoDB AUTO_INCREMENT= DEFAULT CHARSET=utf ;

  DROP TABLE IF EXISTS `hbql` `score`;

  CREATE TABLE `hbql` `score` (

  `id` int( ) unsigned NOT NULL auto_increment

  `score` int( ) unsigned NOT NULL

  `type` varchar( ) NOT NULL

  `sid` int( ) unsigned NOT NULL

  PRIMARY KEY (`id`)

  KEY `FK_score_ ` (`sid`)

  CONSTRAINT `FK_score_ ` FOREIGN KEY (`sid`) REFERENCES `student` (`id`) ON DELETE CASCADE ON UPDATE CASCADE

  ) ENGINE=InnoDB AUTO_INCREMENT= DEFAULT CHARSET=utf ;  

  留意<set>元素中的inverse属性 该属性表示关联关系由主控(一方)还是受控方(多方)维护 所谓关联关系的维护就是受控方的外键插入由谁来控制 inverse默认为false 表示由主控方来控制 当主控方控制时 插入SQL的语句会分两条进行

  insert into Items(itemName itemPrice orderId) values( aa NULL);

  update Items set orderId = where itemName = aa and itemPrice = ;

  因为主控方控制关联关系 意味受控方在插入数据时 不会考虑其外键引用 直接插入为NULL 直到主控方执行更新操作

  

  因为HIbernate分两条SQL语句插入Score对象 所以在SCORE表中 第一次外键为空 所以定义数据库中外键时默认值应为NULL 第二次是更新该条记录的外键 本人在创建SCORE表外键SID默认是不能为空 所以会出现此种情况 更改为NULL一切正常

  如下为HIbernate生成的SQL语句

  部分

  Hibernate:

  insert

  into

  hbql score

  (score type)

  values

  (? ?)

  Hibernate:

  update

  hbql score

  set

  sid=?

  where

cha138/Article/program/Java/ky/201311/28575

相关参考

知识大全 hibernate一对多关联关系

  想了几天终于知道sql语句的发出问题查了很多书感觉都没有说清楚有的还是错的请看下面  [java]  <?xmlversion=?>  <!DOCTYPEhibernatemap

知识大全 Hibernate一对多双向映射及乐观锁使用

Hibernate一对多双向映射及乐观锁使用  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在H

知识大全 Hibernate初学之一对多、多对一关系模型

Hibernate初学之一对多、多对一关系模型  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  举

知识大全 Hibernate的多对一和一对多操作实例

Hibernate的多对一和一对多操作实例  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Hib

知识大全 Hibernate一对一 主键关联映射

Hibernate一对一主键关联映射  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &n

知识大全 hibernate关联关系-一对一

  Java代码  packageDomain;  publicclassPerson  publicintgetId()  returnid;    publicvoidsetId(intid)  

知识大全 Hibernate中多对多关系的常见问题

Hibernate中多对多关系的常见问题  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  1到底在

知识大全 Hibernate数据源不得不注意的问题

Hibernate数据源不得不注意的问题  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Hibe

知识大全 hibernate的多条件动态查询

  在hibernate中是支持多条件动态查询的这种问题是非常实用的比如说你做一个项目要实现一个复合查询  例如有这么一个界面    那么要实现这个查询对于用户来说他的查询条件可能不健全有可能只填写其

知识大全 Hibernate多对多双向关联(xml配置)

Hibernate多对多双向关联(xml配置)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!