读书人

Hibernate Annotation 基于外键的单向

发布时间: 2012-11-18 10:51:21 作者: rapoo

Hibernate Annotation 基于外键的单向一对多关联


基于外键关联的单向一对多关联是一种很少见的情况,并不推荐使用。
基于连接表的单向一对多关联 应该优先被采用。请注意,通过指定unique="true",我们可以把多样性从多对多改变为一对多。


摘自Hibernate Reference

Product与Category是多对一的关系,Product对象维护着对Category对象的参考,如果由Category对象维护对多个Product对象的管理,就是一对多单向关联。
多对一就是从Product端来看,多个产品属于一个分类,每个产品都需要维护各自的Category对象。
而一对多就是从Category端来看,一个Category下有多个分类,Category需要维护多个Product信息。

?


嘿,不好意思,各位看官,因为恢复系统把之前做的物理数据模型图弄丢了,本来打算一并附上的,现在搞不到了,呵呵。

?

?

SQL脚本:(附件中可下载)

?

??? at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:126)
??? at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:114)
??? at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
??? at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:275)
??? at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:266)
??? at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:167)
??? at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
??? at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50)
??? at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1028)
??? at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:366)
??? at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:137)
??? at com.zyp.examples.HibernateTest.addAll(HibernateTest.java:67)
??? at com.zyp.examples.HibernateTest.main(HibernateTest.java:14)
Caused by: java.sql.BatchUpdateException: Field 'category_id' doesn't have a default value
??? at com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:2007)
??? at com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:1443)
??? at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70)
??? at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268)
??? ... 9 more

这个问题和之前的一样,都是因为外键设置了非空导致,外键是可以为空的。
为什么呢?
我们不是通过外键关联来保存Product的么,先保存category,然后保存Product,我们在保存product的时候,没有设置主键值,而是从category的id获取,而此时的product 外键要求非空,因此报错。

mysql> alter table product
??? -> modify category_id int not null;

可以使用上面的语句来重现这个错误。

?

?

?

?

?

?

?

?

读书人网 >软件架构设计

热点推荐