Hibernate의 제4해의 - hibernate집합 매핑

hibernate의 집합 매핑 데모:
사전 요구 사항:
책 북[id,name,authors],authors에는 N개가 있을 수 있으므로 여기에 set로 표시한다.
솔리드 클래스 부트시계는 두 가지가 있는데 그것이 바로 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;

좋은 웹페이지 즐겨찾기