Hibernate의 제4해의 - 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;
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Spring에서 DAO가 순환 호출될 때 데이터가 실시간으로 업데이트되지 않는 해결 방법문제를 설명하기 전에 몇 가지 전제 사항을 설명하십시오. Spring의 구성 파일에서 다음과 같은 방식으로 데이터베이스 트랜잭션을 구성했다고 가정하십시오. 현재 UserDao 및 Security Service가 있습...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.