日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hibernate学习和各种关系总结

發布時間:2023/12/31 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hibernate学习和各种关系总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2019獨角獸企業重金招聘Python工程師標準>>>

原文地址 http://yifanxiang.blog.163.com/blog/static/5000083420105270522523/

hibernate學習和各種關系總結。

?
@Entity?? ?
定一個類向表的映射關系?? ??? ?? ?
@Id?? ?
定義此屬性為主鍵?? ??? ?? ?
@GeneratedValue?? ?
屬性為自增長?? ??? ?? ?
@OneToOne?? ?
一對一的關聯?? ??? ?? ?
@JoinColumn(name="wifeid")?? ?
設定實體屬性的名字(屬性必需是一個實體)?? ?屬性為實體時才可以設置?? ?? ?
@OneToOne(mappedBy="wife")?? ?(mappedBy="wife")?? ?
表示里面的映射關系由屬性來關聯(關聯到自身的主鍵)?? ?? ?
@ManyToOne(cascade={CascadeType.ALL},fetch=FetchType.LAZY)?? ?cascade={CascadeType.ALL}
dml時,會對相互關聯的也進行操作
fetch=FetchType.LAZY
當執行select操作時,延遲加載?? ??? ?? ?
@OneToMany
?? ?(mappedBy="school",cascade={CascadeType.ALL},fetch=FetchType.LAZY)?? ?
一的一邊要加mappedBy="school"?? ?CascadeType.PERSIST:級聯新增

CascadeType.MERGE:
級聯合并

CascadeType.REFRESH:
級聯刷新

CascadeType.REMOVE:
級聯刪除

CascadeType.ALL:
以上四種都是?? ?? ?
@Transient?? ?
指明該屬性不被讀入數據庫中?? ??? ?? ?
@Basic?? ?
可以不寫(即一般屬性)?? ??? ?? ?
??@Lob?? ?
表示被持久化為BlobClob類型 ,具體類型由屬性的類型決定?? ?char[]-->Clob
byte[]--->Blob?? ?? ?
@Colum(updatable=false,name="s_id",nullable=false,lentgh=50,insertable=false,
unique=true)?? ?
說明該列,不可以更新,列名為“s_id”,不可以為空,長度為50,;不可以做為insert語句的一個列;
唯一?? ??? ?? ?
?? ??? ??? ?? ?
?? ??? ??? ?? ?
?? ??? ??? ?
知識點:
有雙向關聯時必設mappedBy="";


單向的一對一外鍵關聯:
Husband
里有一個老婆,一個老婆有一個husband:

?
Wife(
實體屬性)?? ??? ?@Entity?? ??? ??? ??? ?? ?
id?? ?int?? ?@Id
@GeneratedValue?? ??? ??? ??? ?? ?
name?? ?String?? ??? ??? ??? ??? ?? ?
?? ??? ??? ??? ??? ??? ?? ?
Husband(
實體屬性)?? ??? ?@Entity?? ??? ??? ??? ?? ?
id?? ?int?? ?@Id
@GeneratedValue?? ??? ??? ??? ?? ?
name?? ?String?? ??? ??? ??? ??? ?? ?
wife?? ?Wife?? ?@OneToOne?? ?@JoinColumn(name="wifeid")//
設定屬性名為wifeid(默認為wife_id);還可以通過它加入其它屬性。如:約束,長度呀什么的?? ??? ??? ?? ?
?? ??? ??? ??? ??? ??? ?? ?
表名和屬性?? ?類型?? ?寫入的注釋,方法1?? ?另外可加?? ??? ??? ?
方法1產生的表信息:
等同:
<hibernate-mapping>
?? ?<class name="com.bjsxt.hibernate.Student" dynamic-update="true">
?? ??? ?<id name="id">
?? ??? ??? ?<generator class="native"></generator>
?? ??? ?</id>
?? ??? ?<property name="name"></property>
?? ??? ?<property name="age" />
?? ??? ?<property name="sex" />
?? ??? ?<property name="good" type="yes_no"></property>
??? </class>
</hibernate-mapping>


<hibernate-mapping>
?? ?<class name="com.bjsxt.hibernate.StuIdCard">
?? ??? ?<id name="id">
?? ??? ??? ?<generator class="native"></generator>
?? ??? ?</id>
?? ??? ?<property name="num"/>
?? ??? ?<many-to-one name="student" column="studentId" unique="true"></many-to-one>
??? </class>
</hibernate-mapping>


----------------------------------------------------------------------
CREATE TABLE `husband` (
? `id` int(11) NOT NULL auto_increment,
? `name` varchar(255) default NULL,
? `wife_id` int(11) default NULL,
? PRIMARY KEY? (`id`),
? KEY `FKAEEA401B8F955A0A` (`wife_id`),
? CONSTRAINT `FKAEEA401B8F955A0A` FOREIGN KEY (`wife_id`) REFERENCES `wife` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk
---------------------------------------------------------------------------------------
CREATE TABLE `wife` (
? `id` int(11) NOT NULL auto_increment,
? `name` varchar(255) default NULL,
? PRIMARY KEY? (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk
--------------------------------------
加入@JoinColumn(name="wifeid")---------------------------------------------
CREATE TABLE `husband` (
? `id` int(11) NOT NULL auto_increment,
? `name` varchar(255) default NULL,
? `wifeid` int(11) default NULL,
? PRIMARY KEY? (`id`),
? KEY `FKAEEA401B109E78ED` (`wifeid`),
? CONSTRAINT `FKAEEA401B109E78ED` FOREIGN KEY (`wifeid`) REFERENCES `wife` (`id`),
) ENGINE=InnoDB DEFAULT CHARSET=gbk
----------------------------------------------------------------------------------------------------------------------------------------------
雙向的一對一外鍵關聯:
Husband
里有一個老婆:

?
Wife(
實體屬性)?? ??? ?@Entity?? ??? ?@Entity?? ??? ?? ?
id?? ?int?? ?@Id
@GeneratedValue?? ??? ?@Id
@GeneratedValue?? ??? ?? ?
name?? ?String?? ??? ??? ??? ??? ?? ?
husband?? ?Husband?? ?@OneToOne?? ??? ?@OneToOne(mappedBy="wife")?? ??? ?? ?
?? ??? ??? ??? ??? ??? ?? ?
Husband(
實體屬性)?? ??? ?@Entity?? ??? ?@Entity?? ??? ?? ?
id?? ?int?? ?@Id
@GeneratedValue?? ??? ?@Id
@GeneratedValue?? ??? ?? ?
name?? ?String?? ??? ??? ??? ??? ?? ?
wife?? ?Wife?? ?@OneToOne?? ??? ?@OneToOne
@JoinColumn(name="wifeid")?? ??? ?? ?
?? ??? ??? ??? ?
注意mappedBy="wife"而不是
mappedBy="wifeid"?? ??? ?? ?
表名和屬性?? ?類型?? ?寫入的注釋,方法1?? ??? ?方法2?? ??? ?
方法1產生的表信息:
<hibernate-mapping>
?? ?<class name="com.bjsxt.hibernate.Student" dynamic-update="true">
?? ??? ?<id name="id">
?? ??? ??? ?<generator class="native"></generator>
?? ??? ?</id>
?? ??? ?<property name="name"></property>
?? ??? ?<property name="age" />
?? ??? ?<property name="sex" />
?? ??? ?<property name="good" type="yes_no"></property>
?? ??? ?<one-to-one name="stuIdCard" property-ref="student"></one-to-one>
??? </class>
</hibernate-mapping>

<hibernate-mapping>
?? ?<class name="com.bjsxt.hibernate.StuIdCard">
?? ??? ?<id name="id">
?? ??? ??? ?<generator class="native"></generator>
?? ??? ?</id>
?? ??? ?<property name="num"/>
?? ??? ?<many-to-one name="student" column="studentId" unique="true"></many-to-one>
??? </class>
</hibernate-mapping>

----------------------------------------------------------------------
CREATE TABLE `husband` (
? `id` int(11) NOT NULL auto_increment,
? `name` varchar(255) default NULL,
? `wifeid` int(11) default NULL,
? PRIMARY KEY? (`id`),
? KEY `FKAEEA401B109E78ED` (`wifeid`),
? CONSTRAINT `FKAEEA401B109E78ED` FOREIGN KEY (`wifeid`) REFERENCES `wife` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk
---------------------------------------------------------------------------------------
CREATE TABLE `wife` (
? `id` int(11) NOT NULL auto_increment,
? `name` varchar(255) default NULL,
? `husband_id` int(11) default NULL,
? PRIMARY KEY? (`id`),
? KEY `FK2923313F42AFEA` (`husband_id`),
? CONSTRAINT `FK2923313F42AFEA` FOREIGN KEY (`husband_id`) REFERENCES `husband` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk
-------------------------------------------------------------------------------------------------------
方法2創建的表:
-----------------------------------------------------------------------------------------------------
CREATE TABLE `husband` (
? `id` int(11) NOT NULL auto_increment,
? `name` varchar(255) default NULL,
? `wifeid` int(11) default NULL,
? PRIMARY KEY? (`id`),
? KEY `FKAEEA401B109E78ED` (`wifeid`),
? CONSTRAINT `FKAEEA401B109E78ED` FOREIGN KEY (`wifeid`) REFERENCES `wife` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk
可以看出誰有mappedBy="<T>" 誰有外鍵 ,并關鍵到<T>
-----------------------------------------------------------------------------------------------------
CREATE TABLE `wife` (
? `id` int(11) NOT NULL auto_increment,
? `name` varchar(255) default NULL,
? PRIMARY KEY? (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk
--------------------------------------------------------------------------------------------------------------------
單向的一對一主鍵關聯()用得不多:
Husband
里有一個老婆:

?
Wife(
實體屬性)?? ??? ?@Entity?? ??? ??? ??? ?? ?
id?? ?int?? ?@Id
@GeneratedValue?? ??? ??? ??? ?? ?
name?? ?String?? ??? ??? ??? ??? ?? ?
?? ??? ??? ??? ??? ??? ?? ?
Husband(
實體屬性)?? ??? ?@Entity?? ??? ??? ??? ?? ?
id?? ?int?? ?@Id
@GeneratedValue?? ??? ??? ??? ?? ?
name?? ?String?? ??? ??? ??? ??? ?? ?
wife?? ?Wife?? ?@OneToOne
@PrimaryKeyJoinColumn?? ??? ??? ??? ?? ?
?? ??? ??? ??? ??? ??? ?? ?
表名和屬性?? ?類型?? ?寫入的注釋,方法1?? ?另外可加?? ??? ??? ?? ?
?? ??? ??? ??? ??? ??? ?
方法1產生的表信息:
主鍵之間有關聯:
<hibernate-mapping>
?? ?<class name="com.bjsxt.hibernate.Student" dynamic-update="true">
?? ??? ?<id name="id">
?? ??? ??? ?<generator class="native"></generator>
?? ??? ?</id>
?? ??? ?<property name="name"></property>
?? ??? ?<property name="age" />
?? ??? ?<property name="sex" />
?? ??? ?<property name="good" type="yes_no"></property>
??? </class>
</hibernate-mapping>

<hibernate-mapping>
?? ?<class name="com.bjsxt.hibernate.StuIdCard">
?? ??? ?<id name="id">
?? ??? ??? ?<generator class="foreign">
?? ??? ??? ??? ?<param name="property">student</param>
?? ??? ??? ?</generator>
?? ??? ?</id>
?? ??? ?<property name="num"/>
?? ??? ?<one-to-one name="student" constrained="true"></one-to-one>
??? </class>
</hibernate-mapping>

----------------------------------------------------------------------
CREATE TABLE `husband` (
? `id` int(11) NOT NULL auto_increment,
? `name` varchar(255) default NULL,
? PRIMARY KEY? (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk
---------------------------------------------------------------------------------------
CREATE TABLE `wife` (
? `id` int(11) NOT NULL auto_increment,
? `name` varchar(255) default NULL,
? PRIMARY KEY? (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk
-------------------------------------------------------------------------------------------------------
雙向的一對一主鍵關聯(用得不多)
Husband
里有一個老婆,wife里有一個husband

?
Wife(
實體屬性)?? ??? ?@Entity?? ??? ??? ??? ?? ?
id?? ?int?? ?@Id
@GeneratedValue?? ??? ??? ??? ?? ?
name?? ?String?? ??? ??? ??? ??? ?? ?
husband?? ?Husband?? ?@OneToOne
@PrimaryKeyJoinColumn?? ??? ??? ??? ?? ?
?? ??? ??? ??? ??? ??? ?? ?
Husband(
實體屬性)?? ??? ?@Entity?? ??? ??? ??? ?? ?
id?? ?int?? ?@Id
@GeneratedValue?? ??? ??? ??? ?? ?
name?? ?String?? ??? ??? ??? ??? ?? ?
wife?? ?Wife?? ?@OneToOne
@PrimaryKeyJoinColumn?? ??? ??? ??? ?? ?
?? ??? ??? ??? ??? ??? ?? ?
表名和屬性?? ?類型?? ?寫入的注釋,方法1?? ?另外可加?? ??? ??? ?? ?
?? ??? ??? ??? ??? ??? ?
方法1產生的表信息:
主鍵之間有關聯
<hibernate-mapping>
?? ?<class name="com.bjsxt.hibernate.Student" dynamic-update="true">
?? ??? ?<id name="id">
?? ??? ??? ?<generator class="native"></generator>
?? ??? ?</id>
?? ??? ?<property name="name"></property>
?? ??? ?<property name="age" />
?? ??? ?<property name="sex" />
?? ??? ?<property name="good" type="yes_no"></property>
?? ??? ?<one-to-one name="stuIdCard" property-ref="student"></one-to-one>
??? </class>
</hibernate-mapping>

property-ref="person"?
這個屬性是對應你要指定到那個字段的引用,不設置時,默認為引用表的主鍵。

<hibernate-mapping>
?? ?<class name="com.bjsxt.hibernate.StuIdCard">
?? ??? ?<id name="id">
?? ??? ??? ?<generator class="foreign">
?? ??? ??? ??? ?<param name="property">student</param>
?? ??? ??? ?</generator>
?? ??? ?</id>
?? ??? ?<property name="num"/>
?? ??? ?<one-to-one name="student" constrained="true"></one-to-one>
??? </class>
</hibernate-mapping>

------------------------------------------------------------------------------------------------------------
CREATE TABLE `husband` (
? `id` int(11) NOT NULL auto_increment,
? `name` varchar(255) default NULL,
? PRIMARY KEY? (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk
---------------------------------------------------------------------------------------
CREATE TABLE `wife` (
? `id` int(11) NOT NULL auto_increment,
? `name` varchar(255) default NULL,
? PRIMARY KEY? (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk
-------------------------------------------------------------------------------------------------------

雙向的一對一主鍵關聯(用得不多)
Husband
里有一個老婆,wife里有一個husband,在外面有一個聯合的表WifePK

?
Wife(
實體屬性)?? ??? ?@Entity
@IdClass(WifePK.class)?? ??? ??? ??? ?? ?
id?? ?int?? ?@Id?? ??? ??? ??? ?? ?
name?? ?String?? ?@Id?? ??? ??? ??? ?? ?
husband?? ?Husband?? ?@OneToOne
@PrimaryKeyJoinColumn?? ??? ??? ??? ?? ?
?? ??? ??? ??? ??? ??? ?? ?
Husband(
實體屬性)?? ??? ?@Entity?? ??? ??? ??? ?? ?
id?? ?int?? ?@Id
@GeneratedValue?? ??? ??? ??? ?? ?
name?? ?String?? ??? ??? ??? ??? ?? ?
wife?? ?Wife?? ?@OneToOne
?? ?@JoinColumns(
?? ??? ?{
?? ??? ??? ?@JoinColumn(name="wifeId", referencedColumnName="id"),
?? ??? ??? ?@JoinColumn(name="wifeName", referencedColumnName="name")
?? ??? ?}
?? ?)?? ??? ??? ??? ?? ?
?? ??? ??? ??? ??? ??? ?? ?
WifePK(
)
?? ??? ?implements Serializable?? ??? ??? ??? ?? ?
id?? ??? ?
沒有?? ??? ??? ??? ?? ?
name?? ??? ?
沒有?? ??? ??? ??? ?? ?
表名和屬性?? ?類型?? ?寫入的注釋,方法1?? ?另外可加?? ??? ??? ?? ?
?? ??? ??? ??? ??? ??? ?
方法1產生的表信息:
主鍵之間有關聯
------------------------------------------------------------------------------------------------------------
CREATE TABLE `husband` (
? `id` int(11) NOT NULL auto_increment,
? `name` varchar(255) default NULL,
? `wifeId` int(11) default NULL,
? `wifeName` varchar(255) default NULL,
? PRIMARY KEY? (`id`),
? KEY `FKAEEA401BC089B209` (`wifeId`,`wifeName`),
? CONSTRAINT `FKAEEA401BC089B209` FOREIGN KEY (`wifeId`, `wifeName`) REFERENCES `wife` (`id`, `name`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk
---------------------------------------------------------------------------------------
CREATE TABLE `wife` (
? `id` int(11) NOT NULL,
? `name` varchar(255) NOT NULL,
? `age` int(11) NOT NULL,
? PRIMARY KEY? (`id`,`name`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk
-------------------------------------------------------------------------------------------------------
組件映射
Husband
里有一個老婆,wife里有一個husband,放在一張表里:

?
Wife(
實體屬性)?? ??? ?@Entity?? ??? ??? ??? ?? ?
id?? ?int?? ?@Id
@GeneratedValue?? ??? ??? ??? ?? ?
name?? ?String?? ??? ??? ??? ??? ?? ?
husband?? ?Husband?? ?@Embedded?? ??? ??? ??? ?? ?
?? ??? ??? ??? ??? ??? ?? ?
Husband(
實體屬性)?? ??? ??? ??? ??? ??? ?? ?
age?? ?int?? ??? ??? ??? ??? ?? ?
wifeName?? ?String?? ??? ??? ??? ??? ?? ?
?? ??? ??? ??? ??? ??? ?? ?
表名和屬性?? ?類型?? ?寫入的注釋,方法1?? ?另外可加?? ??? ??? ?? ?
?? ??? ??? ??? ??? ??? ?
方法1產生的表信息:
主鍵之間有關聯
<hibernate-mapping>
?? ?<class name="com.bjsxt.hibernate.Husband" >
?? ??? ?<id name="id">
?? ??? ??? ?<generator class="native"></generator>
?? ??? ?</id>?? ??? ?
?? ??? ?<property name="name"></property>
?? ??? ?<component name="wife">
?? ??? ??? ?<property name="wifeName"></property>
?? ??? ??? ?<property name="age"></property>
?? ??? ?</component>
??? </class>
</hibernate-mapping>
------------------------------------------------------------------------------------------------------------
CREATE TABLE `husband` (
? `id` int(11) NOT NULL auto_increment,
? `name` varchar(255) default NULL,
? `age` int(11) NOT NULL,
? `wifeName` varchar(255) default NULL,
? PRIMARY KEY? (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk
-------------------------------------------------------------------------------------------------------

多對一單向映射
多對一關系一般是在(多的一方加外鍵)
一個組Group有多個用戶User:

?
Group(
實體屬性)?? ??? ?@Entity
@Table(name="t_group")?? ??? ??? ??? ?? ?
id?? ?int?? ?@Id
@GeneratedValue?? ??? ??? ??? ?? ?
name?? ?String?? ??? ??? ??? ??? ?? ?
?? ??? ??? ??? ??? ??? ?? ?
?? ??? ??? ??? ??? ??? ?? ?
User(
實體屬性)?? ??? ??? ??? ??? ??? ?? ?
id?? ?int?? ?@Id
@GeneratedValue?? ??? ??? ??? ?? ?
name?? ?String?? ??? ??? ??? ??? ?? ?
group?? ?Group?? ?@ManyToOne
@JoinColumn(name="groupid")?? ??? ??? ??? ?? ?
?? ??? ??? ??? ??? ??? ?? ?
表名和屬性?? ?類型?? ?寫入的注釋,方法1?? ?另外可加?? ??? ??? ?? ?
?? ??? ??? ??? ??? ??? ?
方法1產生的表信息:
<hibernate-mapping>
?? ?<class name="com.bjsxt.hibernate.User" table="t_user">
?? ??? ?<id name="id">
?? ??? ??? ?<generator class="native"></generator>
?? ??? ?</id>
?? ??? ?<property name="name"></property>
?? ??? ?<many-to-one name="group" column="groupId" />
??? </class>
</hibernate-mapping>

<hibernate-mapping>
?? ?<class name="com.bjsxt.hibernate.Group" table="t_group">
?? ??? ?<id name="id">
?? ??? ??? ?<generator class="native"></generator>
?? ??? ?</id>
?? ??? ?<property name="name"></property>
??? </class>
</hibernate-mapping>

可以看出@JoinColumn必需在實體屬性下(即復雜類型)
外鍵最好加在多的一方
------------------------------------------------------------------------------------------------------------
CREATE TABLE `t_group` (
? `id` int(11) NOT NULL auto_increment,
? `name` varchar(255) default NULL,
? PRIMARY KEY? (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk
-------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------
CREATE TABLE `t_user` (
? `id` int(11) NOT NULL auto_increment,
? `name` varchar(255) default NULL,
? `groupId` int(11) default NULL,
? PRIMARY KEY? (`id`),
? KEY `FKCB63CCB6C3D18669` (`groupId`),
? CONSTRAINT `FKCB63CCB6C3D18669` FOREIGN KEY (`groupId`) REFERENCES `t_group` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk
-------------------------------------------------------------------------------------------------------

一對多單向映射
一對多關系一般是在(多的一方加外鍵)
一個組Group有多個用戶User:

?
Group(
實體屬性)?? ??? ?@Entity
@Table(name="t_group")?? ??? ?@Entity
@Table(name="t_group")?? ??? ?? ?
id?? ?int?? ?@Id
@GeneratedValue?? ??? ?@Id
@GeneratedValue?? ??? ?? ?
name?? ?String?? ??? ??? ??? ??? ?? ?
users?? ?HashSet<User>?? ?@OneToMany
@JoinColumn(name="groupId")?? ??? ?@OneToMany?? ??? ?? ?
?? ??? ??? ??? ??? ??? ?? ?
User(
實體屬性)?? ??? ?@Entity
@Table(name="t_user")?? ??? ?@Entity
@Table(name="t_user")?? ??? ?? ?
id?? ?int?? ?@Id
@GeneratedValue?? ??? ?@Id
@GeneratedValue?? ??? ?? ?
name?? ?String?? ??? ??? ??? ??? ?? ?
?? ??? ??? ??? ??? ??? ?? ?
表名和屬性?? ?類型?? ?寫入的注釋,方法1?? ?另外可加?? ?方法2?? ??? ?? ?
?? ??? ??? ??? ??? ??? ?
方法1產生的表信息:
<hibernate-mapping>
?? ?<class name="com.bjsxt.hibernate.User" table="t_user">
?? ??? ?<id name="id">
?? ??? ??? ?<generator class="native"></generator>
?? ??? ?</id>
?? ??? ?<property name="name"></property>
??? </class>
</hibernate-mapping>

<hibernate-mapping>
?? ?<class name="com.bjsxt.hibernate.Group" table="t_group">
?? ??? ?<id name="id">
?? ??? ??? ?<generator class="native"></generator>
?? ??? ?</id>?? ?
?? ??? ?<property name="name"></property>
?? ??? ?<set name="users">
?? ??? ??? ?<key column="groupId"></key>
?? ??? ??? ?<one-to-many class="com.bjsxt.hibernate.User"/>
?? ??? ?</set>
??? </class>
</hibernate-mapping>

可以看出@JoinColumn必需在實體屬性下(即復雜類型)
外鍵最好加在多的一方
可以看出:@JoinColumn(name="groupId")的列創建的外鍵是User方(多的一方)。
------------------------------------------------------------------------------------------------------------
CREATE TABLE `t_group` (
? `id` int(11) NOT NULL auto_increment,
? `name` varchar(255) default NULL,
? PRIMARY KEY? (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk
-------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------
CREATE TABLE `t_user` (
? `id` int(11) NOT NULL auto_increment,
? `name` varchar(255) default NULL,
? `groupId` int(11) default NULL,
? PRIMARY KEY? (`id`),
? KEY `FKCB63CCB6C3D18669` (`groupId`),
? CONSTRAINT `FKCB63CCB6C3D18669` FOREIGN KEY (`groupId`) REFERENCES `t_group` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk
-------------------------------------------------------------------------------------------------------

方法2產生的表信息:
不加@JoinColumn后,會生成3張表;說明@OneToMany在不加@JoinColumn(name="groupId")后會生成一張關聯表
------------------------------------------------------------------------------------------------------------
CREATE TABLE `t_group` (
? `id` int(11) NOT NULL auto_increment,
? `name` varchar(255) default NULL,
? PRIMARY KEY? (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk
-------------------------------------------------------------------------------------------------------
CREATE TABLE `t_user` (
? `id` int(11) NOT NULL auto_increment,
? `name` varchar(255) default NULL,
? PRIMARY KEY? (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk
------------------------------------------------------------------------------------------------------------
CREATE TABLE `t_group_t_user` (
? `t_group_id` int(11) NOT NULL,
? `users_id` int(11) NOT NULL,
? PRIMARY KEY? (`t_group_id`,`users_id`),
? UNIQUE KEY `users_id` (`users_id`),
? KEY `FKCFE61C61872F10D5` (`t_group_id`),
? KEY `FKCFE61C612FC1406D` (`users_id`),
? CONSTRAINT `FKCFE61C612FC1406D` FOREIGN KEY (`users_id`) REFERENCES `t_user` (`id`),
? CONSTRAINT `FKCFE61C61872F10D5` FOREIGN KEY (`t_group_id`) REFERENCES `t_group` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk
-------------------------------------------------------------------------------------------------------

多對一(一對多)雙向映射
多對一關系一般是在(多的一方加外鍵)
一個組Group有多個用戶User:

?
Group(
實體屬性)?? ??? ?@Entity
@Table(name="t_group")?? ??? ??? ??? ?? ?
id?? ?int?? ?@Id
@GeneratedValue?? ??? ??? ??? ?? ?
name?? ?String?? ??? ??? ??? ??? ?? ?
users?? ?HashSet<User>?? ?@OneToMany
(mappedBy="group")?? ??? ?
不加
(mappedBy="group")?? ??? ?? ?
?? ??? ??? ??? ??? ??? ?? ?
User(
實體屬性)?? ??? ??? ??? ??? ??? ?? ?
id?? ?int?? ?@Id
@GeneratedValue?? ??? ??? ??? ?? ?
name?? ?String?? ??? ??? ??? ??? ?? ?
group?? ?Group?? ?@ManyToOne
@JoinColumn(name="groupid")?? ??? ??? ??? ?? ?
?? ??? ??? ??? ??? ??? ?? ?
表名和屬性?? ?類型?? ?寫入的注釋,方法1?? ?另外可加?? ?方法2?? ??? ?? ?
?? ??? ??? ??? ??? ??? ?
方法1產生的表信息:
<hibernate-mapping>
?? ?<class name="com.bjsxt.hibernate.User" table="t_user">
?? ??? ?<id name="id">
?? ??? ??? ?<generator class="native"></generator>
?? ??? ?</id>
?? ??? ?<property name="name"></property>
?? ??? ?<many-to-one name="group" column="groupId"></many-to-one>
??? </class>
</hibernate-mapping>

<hibernate-mapping>
?? ?<class name="com.bjsxt.hibernate.Group" table="t_group">
?? ??? ?<id name="id">
?? ??? ??? ?<generator class="native"></generator>
?? ??? ?</id>?? ?
?? ??? ?<property name="name"></property>
?? ??? ?<set name="users">
?? ??? ??? ?<key column="groupId"></key>
?? ??? ??? ?<one-to-many class="com.bjsxt.hibernate.User"/>
?? ??? ?</set>
??? </class>
</hibernate-mapping>

主要就是在@OneToMany后加
(mappedBy="group")

外鍵最好加在多的一方
------------------------------------------------------------------------------------------------------------
CREATE TABLE `t_group` (
? `id` int(11) NOT NULL auto_increment,
? `name` varchar(255) default NULL,
? PRIMARY KEY? (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk
-------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------
CREATE TABLE `t_user` (
? `id` int(11) NOT NULL auto_increment,
? `name` varchar(255) default NULL,
? `groupId` int(11) default NULL,
? PRIMARY KEY? (`id`),
? KEY `FKCB63CCB6C3D18669` (`groupId`),
? CONSTRAINT `FKCB63CCB6C3D18669` FOREIGN KEY (`groupId`) REFERENCES `t_group` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk
-------------------------------------------------------------------------------------------------------
證明不加,也不會出錯:(在兩個表里這樣不會出錯,但在一個表時最好就會出錯(自關聯的一對多時))

多對多,單向映射

學生和老師的關系(一個學生有多個老師,一個老師有多個學生):

?
Student(
實體屬性)?? ??? ?@Entity
@Table(name="s_student")?? ??? ??? ??? ?? ?
id?? ?int?? ?@Id
@GeneratedValue?? ??? ??? ??? ?? ?
name?? ?String?? ??? ??? ??? ??? ?? ?
?? ??? ??? ??? ??? ??? ?? ?
Teacher(
實體屬性)?? ??? ??? ??? ??? ??? ?? ?
id?? ?int?? ?@Id
@GeneratedValue?? ??? ??? ??? ?? ?
name?? ?String?? ??? ??? ??? ??? ?? ?
Set<Student> students?? ?Group?? ?@ManyToMany?? ??? ??? ??? ?? ?
?? ??? ??? ??? ??? ??? ?? ?
表名和屬性?? ?類型?? ?寫入的注釋,方法1?? ?另外可加?? ?方法2?? ??? ?? ?
?? ??? ??? ??? ??? ??? ?
xml
寫法:
<hibernate-mapping>
?? ?<class name="com.bjsxt.hibernate.Student">
?? ??? ?<id name="id">
?? ??? ??? ?<generator class="native"></generator>
?? ??? ?</id>
?? ??? ?<property name="name"></property>
??? </class>
</hibernate-mapping>

<hibernate-mapping>
?? ?<class name="com.bjsxt.hibernate.Teacher">
?? ??? ?<id name="id">
?? ??? ??? ?<generator class="native"></generator>
?? ??? ?</id>?? ?
?? ??? ?<property name="name"></property>
?? ??? ?<set name="students" table="t_s">
?? ??? ??? ?<key column="teacher_id"></key>
?? ??? ??? ?<many-to-many class="com.bjsxt.hibernate.Student" column="student_id"/>
?? ??? ?</set>
??? </class>
</hibernate-mapping>

------------------------------------------------------------------------------------------------------------
CREATE TABLE `student` (
? `id` int(11) NOT NULL auto_increment,
? `name` varchar(255) default NULL,
? PRIMARY KEY? (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk
-------------------------------------------------------------------------------------------------------
CREATE TABLE `teacher` (
? `id` int(11) NOT NULL auto_increment,
? `name` varchar(255) default NULL,
? PRIMARY KEY? (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk
------------------------------------------------------------------------------------------------------------
CREATE TABLE `teacher_student` (
? `Teacher_id` int(11) NOT NULL,
? `students_id` int(11) NOT NULL,
? PRIMARY KEY? (`Teacher_id`,`students_id`),
? KEY `FK55FA429E78C8936D` (`students_id`),
? KEY `FK55FA429EBF77BA8A` (`Teacher_id`),
? CONSTRAINT `FK55FA429EBF77BA8A` FOREIGN KEY (`Teacher_id`) REFERENCES `teacher` (`id`),
? CONSTRAINT `FK55FA429E78C8936D` FOREIGN KEY (`students_id`) REFERENCES `student` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk
-------------------------------------------------------------------------------------------------------

多對多,雙向映射

學生和老師的關系(一個學生有多個老師,一個老師有多個學生):

?
Student(
實體屬性)?? ??? ?@Entity
@Table(name="s_student")?? ??? ??? ??? ?? ?
id?? ?int?? ?@Id
@GeneratedValue?? ??? ??? ??? ?? ?
name?? ?String?? ??? ??? ??? ??? ?? ?
Set<Teacher> teachers?? ?@ManyToMany(mappedBy="students")?? ??? ??? ??? ??? ?? ?
?? ??? ??? ??? ??? ??? ?? ?
Teacher(
實體屬性)?? ??? ??? ??? ??? ??? ?? ?
id?? ?int?? ?@Id
@GeneratedValue?? ??? ??? ??? ?? ?
name?? ?String?? ??? ??? ??? ??? ?? ?
Set<Student> students?? ?Group?? ?@ManyToMany
@ManyToMany
?? ?@JoinTable(name="t_s",
?? ??? ?joinColumns={@JoinColumn(name="teacher_id")},
?? ??? ?inverseJoinColumns={@JoinColumn(name="student_id")}
?? ??? ?)?? ??? ??? ??? ?? ?
?? ??? ??? ??? ??? ??? ?? ?
表名和屬性?? ?類型?? ?寫入的注釋,方法1?? ?另外可加?? ?方法2?? ??? ?? ?
?? ??? ??? ??? ??? ??? ?
xml
寫法:
<hibernate-mapping>
?? ?<class name="com.bjsxt.hibernate.Student">
?? ??? ?<id name="id">
?? ??? ??? ?<generator class="native"></generator>
?? ??? ?</id>
?? ??? ?<property name="name"></property>
?? ??? ?<set name="teachers" table="t_s">
?? ??? ??? ?<key column="student_id"></key>
?? ??? ??? ?<many-to-many class="com.bjsxt.hibernate.Teacher" column="teacher_id"/>
?? ??? ?</set>
??? </class>
</hibernate-mapping>

<hibernate-mapping>
?? ?<class name="com.bjsxt.hibernate.Teacher">
?? ??? ?<id name="id">
?? ??? ??? ?<generator class="native"></generator>
?? ??? ?</id>?? ?
?? ??? ?<property name="name"></property>
?? ??? ?<set name="students" table="t_s">
?? ??? ??? ?<key column="teacher_id"></key>
?? ??? ??? ?<many-to-many class="com.bjsxt.hibernate.Student" column="student_id"/>
?? ??? ?</set>
??? </class>
</hibernate-mapping>

------------------------------------------------------------------------------------------------------------
CREATE TABLE `student` (
? `id` int(11) NOT NULL auto_increment,
? `name` varchar(255) default NULL,
? PRIMARY KEY? (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk
-------------------------------------------------------------------------------------------------------
CREATE TABLE `teacher` (
? `id` int(11) NOT NULL auto_increment,
? `name` varchar(255) default NULL,
? PRIMARY KEY? (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk
------------------------------------------------------------------------------------------------------------
CREATE TABLE `t_s` (
? `teacher_id` int(11) NOT NULL,
? `student_id` int(11) NOT NULL,
? PRIMARY KEY? (`student_id`,`teacher_id`),
? KEY `FK1BF68BF77BA8A` (`teacher_id`),
? KEY `FK1BF68AEDC6FEA` (`student_id`),
? CONSTRAINT `FK1BF68AEDC6FEA` FOREIGN KEY (`student_id`) REFERENCES `student` (`id`),
? CONSTRAINT `FK1BF68BF77BA8A` FOREIGN KEY (`teacher_id`) REFERENCES `teacher` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk
-------------------------------------------------------------------------------------------------------

?

?

轉載于:https://my.oschina.net/qianzxl/blog/23719

總結

以上是生活随笔為你收集整理的hibernate学习和各种关系总结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。