您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關SpringDataJPA實體類關系映射配置方式有哪些,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
//FetchType.LAZY:懶加載,加載一個實體時,定義懶加載的屬性不會馬上從數據庫中加載 //FetchType.EAGER:急加載,加載一個實體時,定義急加載的屬性會立即從數據庫中加載 //cascade = CascadeType.ALL 表示所有情況下均進行關聯操作,即save-update和delete @JsonBackReference //解決循環引用問題 @JsonIgnoreProperties(value = "order") //解決循環引用問題,order內容大,不加載 //雙向映射存在轉json無限遞歸問題 需要注解來處理 推薦使用第二個注解 value值為對方表作映射的變量值
一方
//教師 @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private int id; private String name; private long salary; @OneToOne @JoinColumn(name="PSPACE_ID") private ParkingSpace parkingSpace;
一方
//停車場 @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private int id; private int lot; private String location;
總結
添加時候需要先添加@OneToOne的那方,刪除也是。
一方
//人員 @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private long id; private String name; @OneToOne @JoinColumn(name="DEPT_ID") @JsonIgnoreProperties(value = "person") private Department department;
一方
//部門 @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private long id; private String name; @OneToOne(mappedBy="department") @JsonIgnoreProperties(value = "department") private Person person;
總結
@JsonBackReference //解決循環引用問題 @JsonIgnoreProperties(value = "order") //解決循環引用問題,order內容大,不加載 //雙向映射存在轉json無限遞歸問題 需要注解來處理 推薦使用第二個注解 value值為對方表作映射的變量值
一方
@Id @GeneratedValue private Long id; @Column(length = 32) private String name; @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)//級聯保存、更新、刪除、刷新;延遲加載 @JoinColumn(name = "author_id")//在book表增加一個外鍵列來實現一對多的單向關聯 private Set<Book> books = new HashSet<Book>();
多方
//單向一對多的情況下 多方不需要加任何關聯標識 @Id @GeneratedValue private Long id; @Column(length=32) private String name;
總結
因為是單向的關聯,多方不需要加任何的關聯標識 只需要在一方添加即可
一方
@Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; //主鍵 private String name; //姓名 //描述客戶可以有多個訂單 @OneToMany(mappedBy = "customer", cascade = CascadeType.ALL) @JsonBackReference private Set<Order> order = new HashSet<Order>();
多方
@Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; private Double money; private String receiverInfo; //收貨地址 // 訂單與客戶關聯 @ManyToOne(cascade = CascadeType.ALL) @JoinColumn(name = "c_id") //指定外鍵列 @JsonIgnoreProperties(value = "order") //解決循環引用問題,order內容大,不加載 private Customer customer; //描述訂單屬于某一個客戶
總結
@JsonBackReference //解決循環引用問題 @JsonIgnoreProperties(value = "order") //解決循環引用問題,order內容大,不加載 //雙向映射存在轉json無限遞歸問題 需要注解來處理 推薦使用第二個注解 value值為對方表作映射的變量值
多方
@GeneratedValue @Id private Integer id; @Column(name="ORDER_NAME") private String orderName; //映射單向 n-1的關聯關系 //使用@ManyToOne來映射多對一的關聯關系 //使用@JoinColumn 來映射外鍵 //可使用 @ManyToOne 的fetch 屬性來修改默認的關聯屬性的加載策略 @JoinColumn(name="CUSTOMER_ID") //此外鍵為一方的主鍵 @ManyToOne(fetch=FetchType.EAGER) private Customer customer;
一方
//單向多對一的情況下,一方不需要加任何關聯標識 @GeneratedValue(strategy=GenerationType.AUTO) @Id private Integer id; private String lastName; private String email; private int age; private Date createdTime; private Date birth;
總結
保存多對一時,建議先保存1的一端,后保存n的一端,這樣不會多出額外的update語句。
多方
@GeneratedValue @Id private Integer id; @Column(name="ORDER_NAME") private String orderName; //映射單向 n-1的關聯關系 //使用@ManyToOne來映射多對一的關聯關系 //使用@JoinColumn 來映射外鍵 //可使用 @ManyToOne 的fetch 屬性來修改默認的關聯屬性的加載策略 @JoinColumn(name="CUSTOMER_ID") @ManyToOne(fetch=FetchType.EAGER) @JsonIgnoreProperties(value = {"customer","orders"}) private Customer customer;
一方
@GeneratedValue(strategy=GenerationType.AUTO) @Id private Integer id; @Column(name="LAST_NAME",length=50,nullable=false) private String lastName; private String email; private int age; //定義日期格式 @Temporal(TemporalType.TIMESTAMP) private Date createdTime; @Temporal(TemporalType.DATE) private Date birth; //映射單向1-n的關聯關系 //使用@OneToMany 映射單向1-n的關聯關系 //使用@JoinColumn 來映射外鍵的名稱 //可以使用@OneToMany 的 fetch 屬性來修改加載策略 //可以使用@OneToMany 的 cascade 屬性來修改默認的刪除策略 // @JoinColumn(name="CUSTOMER_ID") //一的一端放棄維持關聯關系 @OneToMany(fetch=FetchType.EAGER,cascade={CascadeType.REMOVE},mappedBy="customer") @JsonIgnoreProperties(value = "orders") private Set<Order> orders = new HashSet<>();
總結
1.必須使用@JsonIgnoreProperties注解來攔截轉json時無限遞歸的問題
2.若是雙向 1-n 的關聯關系, 執行保存時:
(1)若先保存 n 的一端, 再保存 1 的一端, 默認情況下, 會多出2n 條 UPDATE 語句;
(2)若先保存 1 的一端, 則會多出 n 條 UPDATE 語句。
(3)故在進行雙向 1-n 關聯關系時, 建議使用 n 的一方來維護關聯關系, 而 1 的一方不維護關聯系, 這樣會有效的減少 SQL 語句(即,N的一端對應的表中使用外鍵關聯1的一端,外鍵對應1的一端的表主鍵)
注意:若在 1 的一端的 @OneToMany 中使用 mappedBy 屬性, 則 @OneToMany 端就不能再使用 @JoinColumn 屬性了。
多方
@Id @GeneratedValue private Long id; private String name; // 表示多對多 @ManyToMany(cascade = CascadeType.ALL) // 中間表的表名 @JoinTable(name = "t_user_role", joinColumns = {@JoinColumn(name = "user_id")}, //反轉 user這個表的 反面則是 role inverseJoinColumns = {@JoinColumn(name = "role_id")}) private Set<Role> roles = new HashSet<>();
多方
@Id @GeneratedValue private Long id; private String name;
總結
使用 @JoinTable
來映射中間表
1. name
指向中間表的名字
2. joinColumns
映射當前類所在的表在中間表中的外鍵
2.1 name
指定外鍵列的列名
2.2 referencedColumnName
指定外鍵列關聯當前表的哪一列
3. inverseJoinColumns
映射關聯的類所在中間表的外鍵
多方
@Id @GeneratedValue private Long id; private String name; // 表示多對多 @ManyToMany(fetch = FetchType.LAZY,cascade = CascadeType.REMOVE) @JoinTable(name="t_user_role",joinColumns={@JoinColumn(name="user_id")}, inverseJoinColumns ={@JoinColumn(name="role_id")} ) @JsonIgnoreProperties(value = "users") private Set<Role> roles = new HashSet<>()
多方
@Id @GeneratedValue private Long id; private String name; @ManyToMany(fetch = FetchType.LAZY,cascade = CascadeType.ALL) @JoinTable(name="t_user_role",joinColumns={@JoinColumn(name="role_id")}, inverseJoinColumns ={@JoinColumn(name="user_id")} ) @JsonIgnoreProperties(value = "roles") private Set<User> users = new HashSet<>();
總結
使用 @JoinTable
來映射中間表
1. name
指向中間表的名字
2. joinColumns
映射當前類所在的表在中間表中的外鍵
2.1 name
指定外鍵列的列名
2.2 referencedColumnName
指定外鍵列關聯當前表的哪一列
3. inverseJoinColumns
映射關聯的類所在中間表的外鍵
@JsonBackReference //解決循環引用問題 @JsonIgnoreProperties(value = "order") //解決循環引用問題,order內容大,不加載
雙向映射存在轉json無限遞歸問題 需要注解來處理 推薦使用第二個注解 value值為對方表作映射的變量值
關于“SpringDataJPA實體類關系映射配置方式有哪些”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。