Hibernate之第4解之-hibernate_集合映射

hibernate的集合映射demo:

前提介绍:

      书籍Book【id,name,authors】,authors可能有N个,所以这里用set表示;

      实体类一个Book;表呢有两个:tbook、tauthors;

1:model:

package model;

import java.util.Set;

public class Book {
	private int id;
	private String name;
	private Set<String> authors;
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Set<String> getAuthors() {
		return authors;
	}
	public void setAuthors(Set<String> authors) {
		this.authors = authors;
	}
}

 2:Book的映射文件:hbm.xml

	<class name="Book" table="TBook" lazy="false">
        <id name="id">
            <generator class="native"/>
        </id>
        <property name="name" column="bookName"/>
        <set name="authors" table="TAuthors">
        	<key column="id" />
        	<element column="authorName" type="string" not-null="true" length="30"/>
        </set>
    </class>

     这里有两个地方需要稍微注意:

    *写明not-null="true"生成tauthors表时才会自动为你生成主键【id,authorName】,否则表没有主键;

    *指定length="30"如果不指定,会有以下ERROR,主键生成失败;所以要指定小些;

 not-null="true" length="30"
1218 [main] ERROR org.hibernate.tool.hbm2ddl.SchemaUpdate - Unsuccessful: create table TAuthors (id integer not null, topicName varchar(255) not null, primary key (id, topicName))
1218 [main] ERROR org.hibernate.tool.hbm2ddl.SchemaUpdate - Specified key was too long; max key length is 767 bytes

 3.DAO:

/** add */
	public void addPerson(Book p){
		Session session=null;
		Transaction tran=null;
		try {
			session=HibernateUtil.getSession();
			tran=session.beginTransaction();
			session.save(p);
			tran.commit();
		} catch (HibernateException e) {
			tran.rollback();
			e.printStackTrace();
		}finally{
			if(session!=null && session.isOpen()){
				session.close();
			}
		}
	}

 4:service:

        BookDao dao=new BookDao();
	/** add */
	public void add(Book p){
		dao.addPerson(p);
	}

 5:JUnit 测试:

	@Test public void testAdd() {
		Book p=new Book();
		p.setName("《Java核心技术》");
		Set<String> authors=new HashSet<String>();
		authors.add("Cay S.Horstmann");
		authors.add("Gary Cornell");
		p.setAuthors(authors);
		manager.add(p);
	}

 6:最终数据库结果:

mysql> select * from tbook;
+----+------------------+
| id | bookName         |
+----+------------------+
|  1 | 《Java核心技术》 |
+----+------------------+
1 row in set

mysql> select * from tauthors;
+----+-----------------+
| id | authorName      |
+----+-----------------+
|  1 | Cay S.Horstmann |
|  1 | Gary Cornell    |
+----+-----------------+
2 rows in set

 表的ddl语句:

CREATE TABLE `tbook` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `bookName` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8
--------------------------------------------------------------------
CREATE TABLE `tauthors` (
  `id` int(11) NOT NULL,
  `authorName` varchar(30) NOT NULL,
  PRIMARY KEY (`id`,`authorName`),
  KEY `FK529261547AAF8BC9` (`id`),
  CONSTRAINT `FK529261547AAF8BC9` FOREIGN KEY (`id`) REFERENCES `tbook` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

 That's all;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值