分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 代码编程

Hibernate之表间关系

发布时间:2023-09-06 02:19责任编辑:苏小强关键词:Hibernate

ManyToOne

         多对一,是最常见的表间关系,对应关系数据库中的外键关系。通常用于建立子实体和其父实体的关联关系

@Entity(name = "Person")public static class Person { ???@Id ???@GeneratedValue ???private Long id; ???//Getters and setters are omitted for brevity}@Entity(name = "Phone")public static class Phone { ???@Id ???@GeneratedValue ???private Long id; ???@Column(name = "`number`") ???private String number; ???@ManyToOne ???@JoinColumn(name = "person_id", ???????????foreignKey = @ForeignKey(name = "PERSON_ID_FK") ???) ???private Person person; ???//Getters and setters are omitted for brevity}
CREATE TABLE Person ( ???id BIGINT NOT NULL , ???PRIMARY KEY ( id ))CREATE TABLE Phone ( ???id BIGINT NOT NULL , ???number VARCHAR(255) , ???person_id BIGINT , ???PRIMARY KEY ( id ) )ALTER TABLE PhoneADD CONSTRAINT PERSON_ID_FKFOREIGN KEY (person_id) REFERENCES Person
例子:

Person person = new Person();entityManager.persist( person );Phone phone = new Phone( "123-456-7890" );phone.setPerson( person );entityManager.persist( phone );entityManager.flush();phone.setPerson( null );INSERT INTO Person ( id )VALUES ( 1 )INSERT INTO Phone ( number, person_id, id )VALUES ( ‘123-456-7890‘, 1, 2 )UPDATE PhoneSET ???number = ‘123-456-7890‘, ??????person_id = NULLWHERE ?id = 2

OneToMany

        一对多用于建立父实体和子实体之间的关系。如果子实体侧没有对应的ManyToOne配置,则这个OneToMany是单向的。如果子实体侧有对应的ManyToOne配置,则这个OneToMany是双向的。双向的关系,可以让开发者在两侧都能获取关联关系。

     单向的一对多关系,实例:

@Entity(name = "Person")public static class Person { ???@Id ???@GeneratedValue ???private Long id; ???@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) ???private List<Phone> phones = new ArrayList<>(); ???//Getters and setters are omitted for brevity}@Entity(name = "Phone")public static class Phone { ???@Id ???@GeneratedValue ???private Long id; ???@Column(name = "`number`") ???private String number; ???//Getters and setters are omitted for brevity}CREATE TABLE Person ( ???id BIGINT NOT NULL , ???PRIMARY KEY ( id ))CREATE TABLE Person_Phone ( ???Person_id BIGINT NOT NULL , ???phones_id BIGINT NOT NULL)CREATE TABLE Phone ( ???id BIGINT NOT NULL , ???number VARCHAR(255) , ???PRIMARY KEY ( id ))ALTER TABLE Person_PhoneADD CONSTRAINT UK_9uhc5itwc9h5gcng944pcaslfUNIQUE (phones_id)ALTER TABLE Person_PhoneADD CONSTRAINT FKr38us2n8g5p9rj0b494sd3391FOREIGN KEY (phones_id) REFERENCES PhoneALTER TABLE Person_PhoneADD CONSTRAINT FK2ex4e4p7w1cj310kg2woisjl2FOREIGN KEY (Person_id) REFERENCES Person

     Hibernate对单向的一对多关系,两个实体对应两个表,关联关系使用一个中间表来表达。单向一对多在级联操作上比较低效。

双向一对多

    Hibernate处理双向一对多关系,按多对一的关系来处理,本质上还是主外键关系。双向的一对多使父子双方都能能力来获取关联关系。使操作更方便,效率等同多对一。

    

@Entity(name = "Person")public static class Person { ???@Id ???@GeneratedValue ???private Long id; ???@OneToMany(mappedBy = "person", cascade = CascadeType.ALL, orphanRemoval = true) ???private List<Phone> phones = new ArrayList<>(); ???//Getters and setters are omitted for brevity ???public void addPhone(Phone phone) { ???????phones.add( phone ); ???????phone.setPerson( this ); ???} ???public void removePhone(Phone phone) { ???????phones.remove( phone ); ???????phone.setPerson( null ); ???}}@Entity(name = "Phone")public static class Phone { ???@Id ???@GeneratedValue ???private Long id; ???@NaturalId ???@Column(name = "`number`", unique = true) ???private String number; ???@ManyToOne ???private Person person; ???//Getters and setters are omitted for brevity ???@Override ???public boolean equals(Object o) { ???????if ( this == o ) { ???????????return true; ???????} ???????if ( o == null || getClass() != o.getClass() ) { ???????????return false; ???????} ???????Phone phone = (Phone) o; ???????return Objects.equals( number, phone.number ); ???} ???@Override ???public int hashCode() { ???????return Objects.hash( number ); ???}}CREATE TABLE Person ( ???id BIGINT NOT NULL , ???PRIMARY KEY ( id ))CREATE TABLE Phone ( ???id BIGINT NOT NULL , ???number VARCHAR(255) , ???person_id BIGINT , ???PRIMARY KEY ( id ))ALTER TABLE PhoneADD CONSTRAINT UK_l329ab0g4c1t78onljnxmbnp6UNIQUE (number)ALTER TABLE PhoneADD CONSTRAINT FKmw13yfsjypiiq0i1osdkaeqpgFOREIGN KEY (person_id) REFERENCES Person

Hibernate之表间关系

原文地址:https://www.cnblogs.com/hengwu/p/9864489.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved