Spring Data JPA 關系映射(一對一,一對多,多對多 )


CascadeType.REMOVE 級聯刪除操作,刪除當前實體時,與它有映射關系的實體也會跟着被刪除。
CascadeType.MERGE 級聯更新(合並)操作,當Student中的數據改變,會相應地更新Course中的數據。
CascadeType.DETACH 級聯脫管/游離操作,如果你要刪除一個實體,但是它有外鍵無法刪除,你就需要這個級聯權限了。它會撤銷所有相關的外鍵關聯。
CascadeType.REFRESH 級聯刷新操作,假設場景 有一個訂單,訂單里面關聯了許多商品,這個訂單可以被很多人操作,那么這個時候A對此訂單和關聯的商品進行了修改,與此同時,B也進行了相同的操作,但是B先一步比A保存了數據,那么當A保存數據的時候,就需要先刷新訂單信息及關聯的商品信息后,再將訂單及商品保存。
CascadeType.ALL 擁有以上所有級聯操作權限。


一(被擁有方)mappedBy,mappedBy = "‘多’的實體類的屬性字段",mappedBy 為被擁有方
多(擁有方) @JoinColumn

-----------------------------------------------------------------------


一對一
people 用戶表(id,name,sex,birthday,address_id)

address 地址表(id,phone,zipcode,addr)


people 表
@Entity
public class People {
   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   @Column(name = "id", nullable = false)
   private Long id;//id
   @Column(name = "name", nullable = true, length = 20)
   private String name;//姓名
   @Column(name = "sex", nullable = true, length = 1)
   private String sex;//性別
   @Column(name = "birthday", nullable = true)
   private Timestamp birthday;//出生日期

   @OneToOne(cascade=CascadeType.ALL)
   //People是關系的維護端,當刪除 people,會級聯刪除 address
   @JoinColumn(name = "address_id", referencedColumnName = "id")
   //name:關聯id,referencedColumnName:地址表id
   private Address address;//地址
}
關聯的實體的主鍵一般是用來做外鍵的。但如果此時不想主鍵作為外鍵,則需要設置referencedColumnName屬性。
當然這里關聯實體(Address)的主鍵 id 是用來做主鍵,所以這里第23行的 referencedColumnName = "id" 實際可以省略。


address 表
@Entity
public class Address {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", nullable = false)
    private Long id;//id
    @Column(name = "phone", nullable = true, length = 11)
    private String phone;//手機
    @Column(name = "zipcode", nullable = true, length = 6)
    private String zipcode;//郵政編碼
    @Column(name = "addr", nullable = true, length = 100)
    private String addr;//地址

    //如果不需要根據Address級聯查詢People,可以注釋掉,mappedBy = "People實體類中address屬性"
//    @OneToOne(mappedBy = "address", cascade = {CascadeType.MERGE, CascadeType.REFRESH}, optional = false)
//    private People people;
}

-----------------------------------------------------------------------

一對多
author 作者表(id,name)

article 文章表(id,title,conten,author_id)


author 表
@Entity
public class Author {
    @Id // 主鍵
    @GeneratedValue(strategy = GenerationType.IDENTITY) // 自增長策略
    private Long id; //id
    @NotEmpty(message = "姓名不能為空")
    @Size(min=2, max=20)
    @Column(nullable = false, length = 20)
    private String name;//姓名

    //mappedBy = "Article實體類中author屬性"
    @OneToMany(mappedBy = "author",cascade=CascadeType.ALL,fetch=FetchType.LAZY)
    //級聯保存、更新、刪除、刷新;延遲加載。當刪除用戶,會級聯刪除該用戶的所有文章
    //擁有mappedBy注解的實體類為關系被維護端
    private List<Article> articleList;//文章列表
}


article 表

    @Entity
    public class Article {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY) // 自增長策略
        @Column(name = "id", nullable = false)
        private Long id;
        @NotEmpty(message = "標題不能為空")
        @Size(min = 2, max = 50)
        @Column(nullable = false, length = 50) // 映射為字段,值不能為空
        private String title;
        @Lob  // 大對象,映射 MySQL 的 Long Text 類型
        @Basic(fetch = FetchType.LAZY) // 懶加載
        @NotEmpty(message = "內容不能為空")
        @Size(min = 2)
        @Column(nullable = false) // 映射為字段,值不能為空
        private String content;//文章全文內容

        //可選屬性optional=false,表示author不能為空。刪除文章,不影響用戶
        @ManyToOne(cascade={CascadeType.MERGE,CascadeType.REFRESH},optional=false)
        //author_id關聯author的id字段
    @JoinColumn(name = "author_id", referencedColumnName = "id")
        private Author author;//所屬作者
    }

-----------------------------------------------------------------------


多對多(可以隨意指定一方為關系維護端 @JoinColumn)
user 用戶表(id,username,password)

user_authority 中間表(user_id,authority_id)

authority 權限表(id,authname)


User.java

    @Entity
    public class User {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
        @NotEmpty(message = "賬號不能為空")
        @Size(min=3, max=20)
        @Column(nullable = false, length = 20, unique = true)
        private String username; // 用戶賬號,用戶登錄時的唯一標識
        @NotEmpty(message = "密碼不能為空")
        @Size(max=100)
        @Column(length = 100)
        private String password; // 登錄時密碼
        @ManyToMany
        @JoinTable(name = "user_authority",joinColumns = @JoinColumn(name = "user_id"),
        inverseJoinColumns = @JoinColumn(name = "authority_id"))
        //關系維護端,負責多對多關系的綁定和解除,即實現User.setAuthorityList(authority)
        // @JoinTable name:關聯表的名字,joinColumns:關聯User表的id,inverseJoinColumns:關聯Authority表的id
        private List<Authority> authorityList;
    }


Authority.java

    @Entity
    public class Authority {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Integer id;
        @Column(nullable = false)
        private String authname; //權限名
    //mappedBy = "User實體類中authorityList屬性"
        @ManyToMany(mappedBy = "authorityList")
        private List<User> userList;
    }

-------------------------------------------------------------------------------------


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM