读书人

Hibernate基于连接表的一对多单向联系

发布时间: 2012-11-04 10:42:41 作者: rapoo

Hibernate基于连接表的一对多单向关联

基于连接表,顾名思义就是需要建立中间表来保存两个表的关联关系。与基于外键的一对多关联关系不同的是多了一个保存外键关系的关联表,通过关联表维护两个实体之间的关系。


同时,既然是一对多,一端的Set集合肯定也是少不了的,那么在一端的hbm中,肯定也会有<set>标签出现。

?

一个Person有多个地址,建立3表,连接表jointable保存2个实体表的主键,jointable维护实体表的关联关系。
Person.java实体类中使用集合Set,保存多端的关系,并在Person.hbm.xml文件中配置关联关系。

?

?

?

创建数据库脚本如下:(参看附件)

?

22:59:30,843 DEBUG ConnectionManager:444 - opening JDBC connection22:59:30,843 DEBUG JDBCTransaction:87 - current autocommit status: false22:59:30,843 DEBUG IncrementGenerator:104 - fetching initial value: select max(personid) from person22:59:30,843 DEBUG AbstractBatcher:410 - about to open PreparedStatement (open PreparedStatements: 0, globally: 0)22:59:30,859 DEBUG SQL:111 -     select        max(personid)     from        personHibernate:     select        max(personid)     from        person22:59:30,859 DEBUG IncrementGenerator:119 - first free id: 122:59:30,859 DEBUG AbstractBatcher:418 - about to close PreparedStatement (open PreparedStatements: 1, globally: 1)22:59:30,875 DEBUG AbstractSaveEventListener:135 - generated identifier: 1, using strategy: org.hibernate.id.IncrementGenerator22:59:30,890 DEBUG IncrementGenerator:104 - fetching initial value: select max(addressId) from address22:59:30,890 DEBUG AbstractBatcher:410 - about to open PreparedStatement (open PreparedStatements: 0, globally: 0)22:59:30,890 DEBUG SQL:111 -     select        max(addressId)     from        addressHibernate:     select        max(addressId)     from        address22:59:30,890 DEBUG IncrementGenerator:119 - first free id: 122:59:30,890 DEBUG AbstractBatcher:418 - about to close PreparedStatement (open PreparedStatements: 1, globally: 1)22:59:30,937 DEBUG AbstractSaveEventListener:135 - generated identifier: 1, using strategy: org.hibernate.id.IncrementGenerator22:59:30,937 DEBUG AbstractSaveEventListener:135 - generated identifier: 2, using strategy: org.hibernate.id.IncrementGenerator22:59:30,937 DEBUG JDBCTransaction:134 - commit22:59:30,937 DEBUG AbstractFlushingEventListener:134 - processing flush-time cascades22:59:30,937 DEBUG AbstractFlushingEventListener:177 - dirty checking collections22:59:30,937 DEBUG Collections:199 - Collection found: [com.v512.examples.Person.address#1], was: [<unreferenced>] (initialized)22:59:30,984 DEBUG AbstractFlushingEventListener:108 - Flushed: 3 insertions, 0 updates, 0 deletions to 3 objects22:59:30,984 DEBUG AbstractFlushingEventListener:114 - Flushed: 1 (re)creations, 0 updates, 0 removals to 1 collections22:59:30,984 DEBUG Printer:106 - listing entities:22:59:30,984 DEBUG Printer:113 - com.v512.examples.Person{sex=M, address=[com.v512.examples.Address#1, com.v512.examples.Address#2], age=10, personid=1}22:59:30,984 DEBUG Printer:113 - com.v512.examples.Address{item=address_no1, addressId=2}22:59:30,984 DEBUG Printer:113 - com.v512.examples.Address{item=address_no2, addressId=1}22:59:30,984 DEBUG AbstractBatcher:410 - about to open PreparedStatement (open PreparedStatements: 0, globally: 0)22:59:30,984 DEBUG SQL:111 -     insert     into        hibernate_demo.person        (age, sex, personid)     values        (?, ?, ?)Hibernate:     insert     into        hibernate_demo.person        (age, sex, personid)     values        (?, ?, ?)22:59:30,984 DEBUG AbstractBatcher:66 - Executing batch size: 122:59:30,984 DEBUG AbstractBatcher:418 - about to close PreparedStatement (open PreparedStatements: 1, globally: 1)22:59:30,984 DEBUG AbstractBatcher:410 - about to open PreparedStatement (open PreparedStatements: 0, globally: 0)22:59:30,984 DEBUG SQL:111 -     insert     into        hibernate_demo.address        (item, addressId)     values        (?, ?)Hibernate:     insert     into        hibernate_demo.address        (item, addressId)     values        (?, ?)22:59:31,000 DEBUG AbstractBatcher:248 - reusing prepared statement22:59:31,000 DEBUG SQL:111 -     insert     into        hibernate_demo.address        (item, addressId)     values        (?, ?)Hibernate:     insert     into        hibernate_demo.address        (item, addressId)     values        (?, ?)22:59:31,000 DEBUG AbstractBatcher:66 - Executing batch size: 222:59:31,000 DEBUG AbstractBatcher:418 - about to close PreparedStatement (open PreparedStatements: 1, globally: 1)22:59:31,000 DEBUG AbstractCollectionPersister:1112 - Inserting collection: [com.v512.examples.Person.address#1]22:59:31,000 DEBUG AbstractBatcher:410 - about to open PreparedStatement (open PreparedStatements: 0, globally: 0)22:59:31,000 DEBUG SQL:111 -     insert     into        personadd        (pid, aid)     values        (?, ?)Hibernate:     insert     into        personadd        (pid, aid)     values        (?, ?)22:59:31,000 DEBUG AbstractBatcher:248 - reusing prepared statement22:59:31,000 DEBUG SQL:111 -     insert     into        personadd        (pid, aid)     values        (?, ?)Hibernate:     insert     into        personadd        (pid, aid)     values        (?, ?)22:59:31,000 DEBUG AbstractCollectionPersister:1194 - done inserting collection: 2 rows inserted22:59:31,000 DEBUG AbstractBatcher:66 - Executing batch size: 222:59:31,000 DEBUG AbstractBatcher:418 - about to close PreparedStatement (open PreparedStatements: 1, globally: 1)22:59:31,000 DEBUG JDBCTransaction:147 - committed JDBC Connection22:59:31,000 DEBUG ConnectionManager:427 - aggressively releasing JDBC connection22:59:31,000 DEBUG ConnectionManager:464 - releasing JDBC connection [ (open PreparedStatements: 0, globally: 0) (open ResultSets: 0, globally: 0)]22:59:31,000  INFO SessionFactoryImpl:853 - closing22:59:31,000  INFO DriverManagerConnectionProvider:170 - cleaning up connection pool: jdbc:mysql://localhost:3306/hibernate_demo
?

?

?

?

其他的代码都是通过myeclipse生成的,不是很麻烦。

?


刚开始大家可能会有疑惑,是呀,有3个表,为什么不建3个类,3个hbm文件呢?


事实是这样的,数据库之间的表关联关系通过外键实现,现在有了外键关系表。而实体呢?实体之间是通过集合类进行关联的,我们在Person.hbm.xml文件中配置了一对多的关联关系,自然也不同在建立什么关联关系表的映射文件了,对吧。况且,2个文件能做的事情,何必用3个文件呢。

?

?

读书人网 >软件架构设计

热点推荐