場景:學生(studentbean)與科目(subjectbean)多對多關係
資料庫表設計:
//學生表
drop
table
ifexists
`t_stu`;
create
table
`t_stu` (
`id` bigint(20) not
null auto_increment,
`stu_name`
varchar(20) collate utf8_bin default
null,
`fk_class_id` bigint(20) default
null,
primary
key (`id`)
) engine=innodb auto_increment=20
default charset=utf8 collate=utf8_bin;
//學生與科目關係表
drop
table
ifexists
`t_stu_subj`;
create
table
`t_stu_subj` (
`id` bigint(20) not
null auto_increment,
`fk_stu_id` bigint(20) default
null,
`fk_subj_id` bigint(20) default
null,
primary
key (`id`)
) engine=innodb auto_increment=18
default charset=utf8;
//科目表
drop
table
ifexists
`t_subj`;
create
table
`t_subj` (
`id`
int(11) not
null auto_increment,
`subj_name`
varchar(255) default
null,
primary
key (`id`)
) engine=innodb auto_increment=6
default charset=utf8;
在註解中配置了:
cascade=cascadetype.all//級聯關係
測試:
//測試根據id,查詢學生沒有問題。
//但是在測試刪除學生的方法等時候,會丟擲異常:
com.mysql.jdbc.exceptions.jdbc4.mysqlsyntaxerrorexception:
table 'hibernate.t_subj_t_stu' doesn't exist
//結果hibernate告訴我'hibernate.t_subj_t_stu'中間表不存在,what?
//我的中間表名本來是:t_stu_subj,結果hibernate給我拼接成了t_subj_t_stu???
異常資訊截圖:
測試**:
// @ignore
@test
public
void
testselectstudentbyid()
程式流程:
那麼問題出來了:hibernate框架在根據科目查詢科目裡面的學生的時候,把中間表表名拼錯了
問題極有可能是在學生實體(sudentbean)、科目實體(subjectbean),的註解裡配置manytomany的地方。
學生實體:
@entity
//實體
@table(name="t_stu")//對應資料庫中的表
public
class
studentbean
public
void
setsubjs(setsubjs)
public
studentbean()
public long getid()
public
void
setid(long id)
public string getstuname()
public
void
setstuname(string stuname)
public classbean getcls()
public
void
setcls(classbean cls)
@override
public string tostring()
}
科目實體:
@entity
//實體
@table(name="t_subj")//對應資料庫中的表
public
class
subjectbean
implements
serializable
public
void
setid(long id)
public string getsubjname()
public
void
setsubjname(string subjname)
public setgetstus()
public
void
setstus(setstus)
@override
public string tostring()
}
可以看到學生實體在註解中指定了中間表,科目實體在註解中並沒有指定中間表。因此hibernate在根據科目查詢學生的時候,不知道中間表,所以發生中間表表名拼接錯誤解決方案自然是在科目實體中指定中間表。
那麼得出結論:以後在多對多的註解中,有必要在兩個實體bean中都指定出中間表
另外一點體會:在我們配置了級聯關係為all的時候,兩個實體的耦合度極高,例如:我在刪除學生的時候,還要先查學生裡面的科目有沒有,有就要刪科目,那麼刪除科目,就要先查詢科目裡面的學生有沒有,如果有,那麼就又要刪學生…如此迴圈,真的是牽一髮而動全身,而且這種迴圈的刪除如果資料量過大,好像就沒有盡頭一樣……那麼最後就會變成,我本來只是想刪除一條學生記錄,結果,學生表所有記錄以及科目表所有記錄,全都沒了。
基於上面的體會:建議我自己,以後cascade屬性,盡量不去配置,所有的級聯關係在業務中由自己去控制。以便於好靈活處理。
以上都是我初略總結的。如果您感覺有不同的觀點,那麼肯定你是對的。僅供參考,還望多多指點。
Hibernate4註解詳解之多對多物件對映
3.多對多 在多對多的使用上,建議使用表間關聯方式,使用外來鍵關聯冗餘資料較為嚴重 1.1多對多外來鍵關聯 test和subtest的id為auto increment test.class onetomany cascade cascadetype.all,fetch fetchtype.eage...
hibernate中的關聯之多對多
二 hibernate的多對多 三 多對多關係注意事項 3.3 關聯關係編輯,不需要直接操作橋接表,hibernate的主控方會自動維護 處理 建立乙個橋接表 中間表 將乙個多對多關係轉換成兩個一對多 注1 資料庫多表聯接查詢 永遠就是二個表的聯接查詢 a b c d t1 c d t2 d t3注...
hibernate 多對多註解及刪除問題
那麼這裡的 students 就是teachers的乙個屬性,通常應該是這樣的 set students 另一端的getstudents方法如下所示 manytomany cascade cascadetype.persist,fetch fetchtype.lazy jointable name ...