Hibernate映射關(guān)系詳解

1. 一對一

1.1 單向一對一

 @Entity
 @Table(name="`HUSBAND`")
 @Getter
 @Setter
 public class Husband {

     @Id
     private String id;
     @Column
     private String name;

     @OneToOne
     @JoinColumn(name="wid",unique = true)
     private Wife wife;

 }
 @Entity
 @Table(name="`WIFE`")
 @Getter
 @Setter
 public class Wife {

     @Id
     private String id;
     @Column
     private String name;

 }

DDL語句

CREATE TABLE "public"."HUSBAND" (
  "id" varchar(255) COLLATE "pg_catalog"."default" NOT NULL,
  "name" varchar(255) COLLATE "pg_catalog"."default",
  "wid" varchar(255) COLLATE "pg_catalog"."default",
  CONSTRAINT "HUSBAND_pkey" PRIMARY KEY ("id"),
  CONSTRAINT "fkmdsjpoqvngw6nf2m191u5youl" FOREIGN KEY ("wid") REFERENCES "public"."WIFE" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT "uk_efrl21su077b724pn7stabql1" UNIQUE ("wid")
)
;
CREATE TABLE "public"."WIFE" (
  "id" varchar(255) COLLATE "pg_catalog"."default" NOT NULL,
  "name" varchar(255) COLLATE "pg_catalog"."default",
  CONSTRAINT "WIFE_pkey" PRIMARY KEY ("id")
)
;

1.2 雙向一對一

 @Entity
 @Table(name="`HUSBAND`")
 @Getter
 @Setter
 public class Husband {

     @Id
     private String id;
     @Column
     private String name;

     @OneToOne
     @JoinColumn(name="wid",unique = true)
     private Wife wife;

 }
 @Entity
 @Table(name="`WIFE`")
 @Getter
 @Setter
 public class Wife {

     @Id
     private String id;
     @Column
     private String name;

     @OneToOne(mappedBy = "wife")
     private Husband husband;
 }

雙向外鍵關(guān)系需要指定一方來管理對象之間的關(guān)系。比如在Wife 類中@OneToOne(mappedBy=”wife”)用來指定控制管理權(quán)在Husband 類中。

2. 一對多

2.1 雙向一對多

 @Entity
 @Table(name="`ClassRoom`")
 @Getter
 @Setter
 public class ClassRoom {

     @Id
     private String id;
     @Column
     private String name;

     @OneToMany(mappedBy="cid",cascade={CascadeType.ALL})
     private List<Student> students;

 }
 @Entity
 @Table(name="`Student`")
 @Getter
 @Setter
 public class Student {

     @Id
     private String id;
     @Column
     private String name;
     @ManyToOne
     @JoinColumn(name = "cid")
     private ClassRoom classRoom;
 }

DDL語句

CREATE TABLE "public"."ClassRoom" (
  "id" varchar(255) COLLATE "pg_catalog"."default" NOT NULL,
  "name" varchar(255) COLLATE "pg_catalog"."default",
  CONSTRAINT "ClassRoom_pkey" PRIMARY KEY ("id")
)
;
CREATE TABLE "public"."Student" (
  "id" varchar(255) COLLATE "pg_catalog"."default" NOT NULL,
  "name" varchar(255) COLLATE "pg_catalog"."default",
  "cid" varchar(255) COLLATE "pg_catalog"."default",
  CONSTRAINT "Student_pkey" PRIMARY KEY ("id"),
  CONSTRAINT "fk8tk1mcahy6p0icynb5nfp4xro" FOREIGN KEY ("cid") REFERENCES "public"."ClassRoom" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION
)
;

2.2 單向一對多

@Entity
@Table(name="`ClassRoom`")
@Getter
@Setter
public class ClassRoom {

    @Id
    private String id;
    @Column
    private String name;

    @OneToMany(targetEntity = Student.class)
    @JoinColumn(name="cid")
    private List<Student> students;

}
 @Entity
 @Table(name="`Student`")
 @Getter
 @Setter
 public class Student {

     @Id
     private String id;
     @Column
     private String name;

 }

3. 多對多

 @Entity
 @Table(name = "`User`")
 @Getter
 @Setter
 public class User {

     @Id
     private String id;
     @Column
     private String name;

     @ManyToMany(targetEntity = Role.class)
     @JoinTable(
             name = "`User_Role`",
             joinColumns = @JoinColumn(name = "uid"),
             inverseJoinColumns = @JoinColumn(name = "rid")
     )
     private List<Role> roles;

 }
 @Entity
 @Table(name = "`Role`")
 @Getter
 @Setter
 public class Role {

     @Id
     private String id;
     @Column
     private String name;

     @ManyToMany(targetEntity = User.class)
     @JoinTable(
             name = "`User_Role`",
             joinColumns = @JoinColumn(name = "rid"),
             inverseJoinColumns = @JoinColumn(name = "uid")
     )
     private List<User> users;
 }
 @Entity
 @Table(name = "`User_Role`")
 @Getter
 @Setter
 @EqualsAndHashCode
 public class UserRole implements Serializable {

     @Id
     private String uid;
     @Id
     private String rid;
 }

DDL語句

CREATE TABLE "public"."User" (
  "id" varchar(255) COLLATE "pg_catalog"."default" NOT NULL,
  "name" varchar(255) COLLATE "pg_catalog"."default",
  CONSTRAINT "User_pkey" PRIMARY KEY ("id")
)
;
CREATE TABLE "public"."Role" (
  "id" varchar(255) COLLATE "pg_catalog"."default" NOT NULL,
  "name" varchar(255) COLLATE "pg_catalog"."default",
  CONSTRAINT "Role_pkey" PRIMARY KEY ("id")
)
;
CREATE TABLE "public"."User_Role" (
  "uid" varchar(255) COLLATE "pg_catalog"."default" NOT NULL,
  "rid" varchar(255) COLLATE "pg_catalog"."default" NOT NULL,
  CONSTRAINT "User_Role_pkey" PRIMARY KEY ("uid", "rid"),
  CONSTRAINT "fk3sgutdk2w2qp0m93b56668iq3" FOREIGN KEY ("rid") REFERENCES "public"."Role" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT "fkkp3fplbbyj2ohb5vv6668ubg2" FOREIGN KEY ("uid") REFERENCES "public"."User" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION
)
;

如果需要單向多對多,去掉對應(yīng)關(guān)系即可。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容