レビュー
1.1対1の単一の外部キーの関連付け
Student04
@Entity
public class Students04 implements Serializable {
@Id //设置为主键
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int sid;
@OneToOne(cascade = CascadeType.ALL)//指定被控类, 默认是全级联
@JoinColumn(name = "pid", unique = true)//name指定被控类(IdCard类)的主键, unique说明该键是唯一的
private IdCard card;
private String gender; //性别
private Date birthday; //出生日期
private String major; //专业 ... 构造方法和settergetter方法自行补充 ...}
IDカード
@Entity
public class IdCard {
@Id
@GeneratedValue(generator = "pid")
@GenericGenerator(name = "pid", strategy = "assigned")
@Column(length = 18)
private String pid; //身份证号码
private String sname; //学生姓名 ... 构造方法和settergetter方法自行补充 ...}
構成ファイル
<mapping class="com.idea.hibernate.oto_fk.Students04"/>
<mapping class="com.idea.hibernate.oto_fk.IdCard"/>
テスト(メインテーブルオブジェクトを保存する前に、外部キーオブジェクトを保存する必要があります)
@Test
public void addStudents04(){
Configuration configuration = new Configuration().configure();
SessionFactory sessionFactory = createSessionFactory(configuration);
Session session = sessionFactory.getCurrentSession();
Transaction tx = session.beginTransaction();
IdCard card = new IdCard("1234567890123456", "王五");
Students04 students04 = new Students04(card, "男", new Date(), "Java开发");
session.save(card);
session.save(students04);
tx.commit();
}
/**
* 建表策略
*/
private SessionFactory createSessionFactory(Configuration configuration){
//创建服务注册对象
StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
//生成SssionFactory
SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
//返回配置对象
return sessionFactory;
}
ps:同じエンティティクラスの注釈は、属性に書き込むか、getXxxメソッドに書き込む必要があり、混在させることはできません。
2.1対1の双方向外部キーの関連付け
特徴:私はあなたの中にいます、あなたは私の中にいます
マスターパーティの記述は、1対1の一方向の関連付けと同じですが、違いは、被告側(IdCard)が
双方向の関連付けの場合、mappedBy属性を設定し、制御するマスターに渡す必要があります。
IdCard02
@Entity
public class IdCard02 {
@Id
@GeneratedValue(generator = "pid")
@GenericGenerator(name = "pid", strategy = "assigned")
@Column(length = 18)
private String pid; //身份证号码
private String sname; //学生姓名
@OneToOne(mappedBy = "card") //指定主控方(Students05)中的属性
private Students05 students05; ... 构造方法和settergetter方法自行补充 ...}
他の部分は同じです。
3.1対1の双方向外部キーユニオンプライマリキー
①プライマリキークラスStudentsPKを作成する
②プライマリキークラスの注釈@Embeddable
@Embeddable パブリッククラスStudentsPKはSerializableを実装します{ privatestatic final long serialVersionUID = 6632444697825110476L; @Column(length = 18) プライベート文字列ID; //身份证号 @Column(length = 8) private String sid; //学号...}
③エンティティクラスにプライマリキークラスの属性を導入し、属性に注釈@EmbeddedIdを使用します
Hibernateアノテーション開発の属性レベルのアノテーションに詳細に移動します
4.1対多の単一の外部キーの関連付け
1つのパーティーは、複数の学生が参加するクラス(1対多)など、多くのパーティーのコレクションを開催します
Student07
@Entity
public class Students07 implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int sid;
private String sname;
private String gender;
private String major;
private Date birthday; ...}
ClassRoom01
@Entity
public class ClassRoom01 {
@Id
@GeneratedValue(generator = "cid")
@GenericGenerator(name = "cid", strategy = "assigned")
@Column(length = 4)
private String cid;
private String cname;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY) //多的一方使用急加载, 一的一方使用懒加载
@JoinColumn(name = "CID")
private Set<Students07> stus; //一的一方持有多的一方的集合 ...}
5.1対多の双方向外部キーアソシエーション
クラスクラスの構成は、クラスクラス参照が学生クラスに追加されることを除いて、一方向構成と同じです。
Student08
@Entity
public class Students08 implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int sid;
private String sname;
private String gender;
private String major;
private Date birthday;
@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER) //多的一方需要设为急加载
@JoinColumn(name = "CID")
private ClassRoom02 classRoom02; //多的一方持有一的一方的引用 ...}
6.多対多の単一の外部キーアソシエーション
①学生と教師の対応する関係は多対多の関係です
②学生テーブルには教師テーブルのコレクションがあります
③中間テーブルを作成する
Student09
@Entity
public class Students09 implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int sid;
private String sname;
private String gender;
private String major;
private Date birthday;
@ManyToMany
@JoinTable(
name = "teachers_students", //中间表的名称
joinColumns = {@JoinColumn(name = "SID")}, //中间表外键关联字段的名称
inverseJoinColumns = {@JoinColumn(name = "TID")} //中间表外键关联字段的名称
)
private Set<Teachers> teachers; //学生持有教师的集合 ...}
教師
@Entity
public class Teachers {
@Id
@GeneratedValue(generator = "tid")
@GenericGenerator(name = "tid", strategy = "assigned")
@Column(length = 4)
private String tid; //教师的编号
private String tname; //教师的姓名 ...}
7.多対多の双方向外部キーアソシエーション
両当事者は、マスターと被告人を含む互いのコレクションを保持しており、マスターに制御を移す必要があります
@Entity
public class Teachers01 {
@Id
@GeneratedValue(generator = "tid")
@GenericGenerator(name = "tid", strategy = "assigned")
@Column(length = 4)
private String tid; //教师的编号
private String tname; //教师的姓名
@ManyToMany(mappedBy = "teachers") //将主控权给学生方, teachers是学生类中的属性
private Set<Students10> stus; ...}
学生クラスはテストと同じです