前言

近期在開發新的專案會用到JPA,
之前都傾向用JDBC,碰到JPA都是一些簡單的CRUD,
從零開始開發用JPA算是第一次,記錄一下使用JPA上遇到的問題。

因為屬於小型系統,
所以目前只有實作user及role相關的table。

開發前會先規劃好建立table的SQL

以下作為文章示範用的ERD:
user/role/user_role ERD

SQL語法範例-> 【sql】create table user,role,user_role


第一步:建立Entity

JPA 首先會建立Entity,這邊就先遇到一個坑,
如果有使用Lombok的@Data會一直跳出stackoverflow的錯誤,
除非使用@Getter + @Setter。
或是另一種方式(待補..)
會造成這個原因是(太長待補..)

Entity - User (父表)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
@Getter
@Setter
@Entity
@Table(name = "user", schema = "test")
public class User {
@Id
@Column(name = "user_id")
private Integer userId;

@Column(name = "password")
private String password;

@Column(name = "username")
private String username;

@ManyToMany(cascade = CascadeType.ALL)
// 多對多關係 中介表
@JoinTable(name = "user_role",
// user FK
joinColumns = @JoinColumn(name = "user_id"),
// role FK
inverseJoinColumns = @JoinColumn(name = "role_id"))
// 建議ManyToMany用Set會依照PK遞增排序,用ArrayList會允許重複因此不建議。
private Set<Role> roles = new HashSet<>();

}

Entity - Role (子表)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Getter
@Setter
@Entity
@Table(name = "role", schema = "test")
public class Roles {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) // 自動增加
@Column(name = "role_id")
private Integer roleId;
@Column(name = "role_name")
private String role;

@ManyToMany(mappedBy = "roles")
private Set<User> users = new HashSet<>();
}

紀錄@ManyToMany參數設定

…待補