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?? ?表示被持久化為Blob或Clob類型 ,具體類型由屬性的類型決定?? ?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学习和各种关系总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【JavaScript】图片加载由模糊变
- 下一篇: 准备辞职了,走之前想解决的问题ptr