記事のディレクトリ
気持ち:カスケードマッピングが外部キーテーブルを保存するときに外部キーテーブルを自動的に保存するには、保存操作で外部キーテーブルのオブジェクトを作成する必要があります。操作なしで保存したいことをどのように知ることができますか。!
基礎
-
関係(関係)
実世界の物の内部および物の間の接続は、エンティティ内の接続およびエンティティ間の接続として情報の世界に反映されます。 -
エンティティ間の関係は、
1対1の関係(1:1)、
1対多の関係(1:n)、
多対多の関係(m:n)に分けることができます。
これらの方法は両方とも、外部キーの作成を必要とします。
主キーの関連付けのマッピング
ユーザーテーブルに対応するIDは、個人テーブルに格納され
ます。2つのテーブルの主キーは同じです。
どちらも主キーと外部キーです。
ファイル構造
データベースのuserテーブルのid列に外部キーが設定されており、オブジェクトはpersonテーブルのid列です。
<?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">
<hibernate-mapping package="com.hibernate.entity">
<class name="User" table="hibernate_04_01_user">
<id name="id">
<!-- 设置自动递增 -->
<generator class="identity"/>
</id>
<property name="userName" column="user_name"/>
<property name="password" column="password"/>
<!-- name=实体类中属性名,class=对应的元素的类型 / 关联的属性的类型
一对一关联关系,
如果Person对象不在本包的下的话,就需要配置的是全线路径了。com.hibernate.entitty.Person.java -->
<!-- one-to-one:一对一
name:User实体类中某个属性名
class:同User关联的类型
cascade:级联操作,当操作user对象时,级联操作同user关联的person对象
-all:所有操作都级联
-none:所有操作都不级联(默认取值)
-save-update:插入或者更新操作级联
-delete:删除操作级联 -->
<one-to-one name="person" class="Person" cascade="all"></one-to-one>
</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">
<hibernate-mapping package="com.hibernate.entity">
<class name="Person" table="hibernate_04_01_person">
<id name="id">
<generator class="foreign"><!-- 设置主键的生成策略,表明既是主键又是外键 -->
<!-- name="property"表示当前配置的是某个属性,user是这个属性的名字 -->
<param name="property">user</param>
</generator>
</id>
<property name="realName" column="real_name"/>
<property name="idNumber" column="id_number"/>
<!-- 映射user属性,实质上是在映射Person和User之间的一对一关联关系 -->
<!-- one-to-one:一对一
name:User实体类中某个属性名
class:同User关联的类型
constrained="true"表示约束关系-->
<one-to-one name="user" class="User" constrained="true" ></one-to-one>
</class>
</hibernate-mapping>
package com.hibernate.ui;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.hibernate.entity.Person;
import com.hibernate.entity.User;
import com.hibernate.util.HibernateUtil;
public class Test {
public static void main(String[] args) {
saveUser();
// addPerson();
// deleteUser();
//关闭SessionFactory
HibernateUtil.closeSessionFactory();
}//-----------------------------------------------------------------------------------------
public static void saveUser() {
Session session = HibernateUtil.openSession();
Transaction tx = session.beginTransaction();
User u = new User();
u.setUserName("name6");
u.setPassword("0006");
session.save(u);
tx.commit();
session.close();
}
//给已经存在的账户添加实名认证信息
public static void addPerson() {
Session session = HibernateUtil.openSession();
Transaction tx = session.beginTransaction();
//检索出已经存在的账户信息
User u = session.get(User.class, new Integer(3));
Person p = new Person();
p.setRealName("小小张");
p.setIdNumber("12222222220121");
//建立关联
u.setPerson(p);
p.setUser(u);
//保存
session.save(p);
tx.commit();
session.close();
}
public static void deleteUser() {
Session session = HibernateUtil.openSession();
Transaction tx = session.beginTransaction();
User u = session.get(User.class, new Integer(3));
session.delete(u);
tx.commit();
session.close();
}
}
一意の外部キー関連付けマッピング
外部キー値を関連付ける唯一の方法。
上記の外部キーに一意の識別子を追加すると、多対1は1対1の対応になります。追加しないと多対一の関係になります。
<?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">
<hibernate-mapping package="com.hibernate.entity">
<class name="User" table="hibernate_04_02_user">
<id name="id">
<!-- 设置自动递增 -->
<generator class="identity"/>
</id>
<property name="userName" column="user_name"/>
<property name="password" column="password"/>
<!-- 下面配置的是外键列 -->
<!-- name=实体类中属性名,class=对应的元素的类型 / 关联的属性的类型
一对一关联关系,
如果Person对象不在本包的下的话,就需要配置的是全线路径了。com.hibernate.entitty.Person.java -->
<!-- one-to-one:一对一
many-to-one:使用唯一外键关联映射,实质上是多对一的一种特殊情况,unique="true"(外键字段的值不能重复)
name:User实体类中某个属性名
class:同User关联的类型
column:外键字段列名
cascade:级联操作,当操作user对象时,级联操作同user关联的person对象
-all:所有操作都级联
-none:所有操作都不级联(默认取值)
-save-update:插入或者更新操作级联
-delete:删除操作级联 -->
<!-- 此处的column属性必须配置 -->
<many-to-one name="person" class="Person" cascade="all" unique="true"
column="PERSON_ID"></many-to-one>
</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">
<hibernate-mapping package="com.hibernate.entity">
<class name="Person" table="hibernate_04_02_person">
<id name="id">
<generator class="identity">
<!-- name="property"表示当前配置的是某个属性,user是这个属性的名字 -->
<param name="property">user</param>
</generator>
</id>
<property name="realName" column="real_name"/>
<property name="idNumber" column="id_number"/>
<!-- 映射user属性,实质上是在映射Person和User之间的一对一关联关系 -->
<!-- one-to-one:一对一
name:User实体类中某个属性名
class:同User关联的类型
property-ref:外键列对应的属性名-->
<one-to-one name="user" class="User" property-ref="person"></one-to-one>
<!-- 与Person类关联的User类中关联的哪个属性 -->
</class>
</hibernate-mapping>
package com.hibernate.ui;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.hibernate.entity.Person;
import com.hibernate.entity.User;
import com.hibernate.util.HibernateUtil;
public class Test {
public static void main(String[] args) {
saveUser();
// addPerson();
// deleteUser();
//关闭SessionFactory
HibernateUtil.closeSessionFactory();
}//-----------------------------------------------------------------------------------------
public static void saveUser() {
Session session = HibernateUtil.openSession();
Transaction tx = session.beginTransaction();
User u = new User();
u.setUserName("张三");
u.setPassword("123123");
Person p = new Person();
p.setRealName("大张");
p.setIdNumber("3421324232323");
//建立关联
u.setPerson(p);
p.setUser(u);
session.save(u);
tx.commit();
session.close();
}
//给已经存在的账户添加实名认证信息
public static void addPerson() {
Session session = HibernateUtil.openSession();
Transaction tx = session.beginTransaction();
//检索出已经存在的账户信息
User u = session.get(User.class, new Integer(3));
Person p = new Person();
p.setRealName("小小张");
p.setIdNumber("12222222220121");
//建立关联
u.setPerson(p);
p.setUser(u);
//保存
session.save(p);
tx.commit();
session.close();
}
public static void deleteUser() {
Session session = HibernateUtil.openSession();
Transaction tx = session.beginTransaction();
User u = session.get(User.class, new Integer(3));
session.delete(u);
tx.commit();
session.close();
}
}