Hibernate一對多使用Map和Set的區別
系統
1785 0
?使用Map和Set的集合映射,都可以配合1對多,但是其中還是有細微的差別,主要體現在一方的inverse屬性上
數據庫結構如下:
其中member表的team字段對應team的id
CREATE
?
TABLE
?`member1`?(
??`id`?
varchar
(
50
)?
NOT
?
NULL
,
??`name`?
varchar
(
50
)?
default
?
NULL
,
??`age`?
varchar
(
50
)?
default
?
NULL
,
??`teamRole`?
varchar
(
50
)?
default
?
NULL
,
??`team`?
varchar
(
50
)?
default
?
NULL
,
??
PRIMARY
?
KEY
??(`id`)
)?ENGINE
=
InnoDB?
DEFAULT
?CHARSET
=
gb2312;
CREATE
?
TABLE
?`team1`?(
??`id`?
varchar
(
50
)?
NOT
?
NULL
,
??`name`?
varchar
(
50
)?
default
?
NULL
,
??
PRIMARY
?
KEY
??(`id`)
)?ENGINE
=
InnoDB?
DEFAULT
?CHARSET
=
gb2312;
?
持久話類(使用Set方式)
?
package
?maponetomany;
public
?
class
?Member?
...
{
????
private
?String?id;
???
private
?String?name;
???
private
?String?teamRole;
???
private
?Team?team;
???
private
?String?age;
public
?String?getAge()?
...
{
????
return
?age;
}
public
?
void
?setAge(String?age)?
...
{
????
this
.age?
=
?age;
}
public
?String?getName()?
...
{
????
return
?name;
}
public
?
void
?setName(String?name)?
...
{
????
this
.name?
=
?name;
}
public
?String?getTeamRole()?
...
{
????
return
?teamRole;
}
public
?
void
?setTeamRole(String?teamRole)?
...
{
????
this
.teamRole?
=
?teamRole;
}
public
?String?getId()?
...
{
????
return
?id;
}
public
?
void
?setId(String?id)?
...
{
????
this
.id?
=
?id;
}
public
?Team?getTeam()?
...
{
????
return
?team;
}
public
?
void
?setTeam(Team?team)?
...
{
????
this
.team?
=
?team;
}
}
package
?maponetomany;
import
?java.util.HashSet;
import
?java.util.Map;
import
?java.util.Set;
public
?
class
?Team?
...
{
???
private
?String?id;
???
private
?String?name;
???
private
?Set?members
=
new
?HashSet();
public
?String?getId()?
...
{
????
return
?id;
}
public
?
void
?setId(String?id)?
...
{
????
this
.id?
=
?id;
}
public
?Set?getMembers()?
...
{
????
return
?members;
}
public
?
void
?setMembers(Set?members)?
...
{
????
this
.members?
=
?members;
}
public
?String?getName()?
...
{
????
return
?name;
}
public
?
void
?setName(String?name)?
...
{
????
this
.name?
=
?name;
}
}
這是相應的HBM映射文件
<?
xml?version="1.0"?encoding="utf-8"
?>
<!
DOCTYPE?hibernate-mapping?PUBLIC?"-//Hibernate/Hibernate?Mapping?DTD?3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
>
<!--
?
????Mapping?file?autogenerated?by?MyEclipse?-?Hibernate?Tools
-->
<
hibernate-mapping?
package
="maponetomany"
>
???
????
?????
<
class?
name
="Member"
?table
="member1"
>
???????
<
id?
name
="id"
?column
="id"
>
?????????
<
generator?
class
="uuid.hex"
></
generator
>
???????
</
id
>
???????
<
property?
name
="name"
?column
="name"
/>
???????
<
property?
name
="age"
?column
="age"
/>
???????
<
property?
name
="teamRole"
?column
="teamRole"
?
/>
???????
<
many-to-one?
name
="team"
?column
="team"
?
/>
????
</
class
>
</
hibernate-mapping
>
<?
xml?version="1.0"?encoding="utf-8"
?>
<!
DOCTYPE?hibernate-mapping?PUBLIC?"-//Hibernate/Hibernate?Mapping?DTD?3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
>
<!--
?
????Mapping?file?autogenerated?by?MyEclipse?-?Hibernate?Tools
-->
<
hibernate-mapping?
package
="maponetomany"
>
????
<
class?
name
="Team"
?table
="team1"
>
???????
<
id?
name
="id"
?column
="id"
>
?????????
<
generator?
class
="uuid.hex"
></
generator
>
???????
</
id
>
???????
<
property?
name
="name"
?column
="name"
/>
???????
<
set?
name
="members"
?inverse
="true"
?cascade
="save-update"
>
??????????
<
key?
column
="team"
/>
??????????
<
one-to-many?
class
="Member"
/>
???????
</
set
>
????
</
class
>
</
hibernate-mapping
>
以下是測試代碼:
這里要注意的是,member的teamRole屬性是通過javabean的set方式注入的,用Map實現時,則是作為map的index屬性去注入,沒有在代碼中顯示的調用set方法,這也是本文討論的重點
public
?
static
?
void
?main(String[]?args)?
...
{
????????Configuration?cfg
=
new
?Configuration();
????????cfg.configure();
????????SessionFactory?sf
=
cfg.buildSessionFactory();
????????Session?session
=
sf.openSession();
????????Transaction?t
=
session.beginTransaction();
????????Team?team
=
new
?Team();
????????team.setName(
"
足球隊-01
"
);
????????
????????
????????Member?m1
=
new
?Member();
????????m1.setName(
"
01隊01號
"
);
????????m1.setAge(
"
22
"
);
????????m1.setTeam(team);
????????m1.setTeamRole(
"
中后衛
"
);
????????
????????Member?m2
=
new
?Member();
????????m2.setName(
"
01隊02號
"
);
????????m2.setAge(
"
33
"
);
????????m2.setTeam(team);
????????m2.setTeamRole(
"
守門員
"
);
????????
????????team.getMembers().add(m1);
????????team.getMembers().add(m2);
???????
????????session.save(team);
????????t.commit();
????????System.out.println(
"
success
"
);
????}
運行結果如下:
Hibernate: insert into team1 (name, id) values (?, ?)
Hibernate: insert into member1 (name, age, teamRole, team, id) values (?, ?, ?, ?, ?)
Hibernate: insert into member1 (name, age, teamRole, team, id) values (?, ?, ?, ?, ?)
可以看到,兩個表的數據都插入了,而且關聯正確(member的team值為team表的id)
如果我們改成Map方式,則需要改變持久話類的代碼和映射文件,如下:
持久話類變化不大,只不過是把Set換成Map,但映射文件變化較大
?
Hibernate一對多使用Map和Set的區別
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元