[Java] JPA에서 1대N으로 중간 테이블이 있는 DB를 Model에 떨어뜨림
15182 단어 자바
표 구성
users 테이블과 roles 테이블이 1대N의 관계이며, 중간 테이블이 있는 구성.
사용자
Table "public.users"
Column | Type | Modifiers
----------+------------------------+----------------------------------------------------------
id | integer | not null default nextval('users_id_seq'::regclass)
name | character varying(255) | not null
Indexes:
"users_pkey" PRIMARY KEY, btree (id)
맵핑
Table "public.mappings"
Column | Type | Modifiers
--------------+----------+-------------------------------------------------------------
id | integer | not null default nextval('mappings_id_seq'::regclass)
user_id | integer | not null
role_id | integer | not null
Indexes:
"mappings_pkey" PRIMARY KEY, btree (id)
"mappings_user_id_role_id_key" UNIQUE CONSTRAINT, btree (user_id, role_id)
roles
Table "public.roles"
Column | Type | Modifiers
--------------+------------------------+------------------------------------------------------------
id | integer | not null default nextval('roles_id_seq'::regclass)
name | character varying(255) | not null
Indexes:
"roles_pkey" PRIMARY KEY, btree (id)
모델 작성
UserModel
UserModel
@Getter
@Entity
@Table(name="users")
public class UserModel {
@Id
private Long id;
private String name;
@OneToMany(fetch = FetchType.EAGER)
@JoinTable(
// 中間テーブル名
name="mappings",
joinColumns = {
/*
* mappings -> usersの関係を定義
* name=mappingsテーブルのカラム名
* referencedColumnName=usersテーブルのカラム名
*/
@JoinColumn(name="user_id", referencedColumnName="id")
},
inverseJoinColumns = {
/*
* mappings -> rolesの関係を定義
* name=mappingsテーブルのカラム名
* referencedColumnName=rolesテーブルのカラム名
*/
@JoinColumn(name="role_id", referencedColumnName="id")
}
)
private List<RoleModel> roles;
RoleModel
RoleModel
@Getter
@Entity
@Table(name="role")
public class RoleModel {
@Id
private Long id;
private String name;
@ManyToOne(fetch = FetchType.EAGER)
@JoinTable(
// 中間テーブル名
name="mappings",
joinColumns = {
/*
* mappings -> rolesの関係を定義
* name=mappingsテーブルのカラム名
* referencedColumnName=roleテーブルのカラム名
*/
@JoinColumn(name ="role_id", referencedColumnName ="id")
},
inverseJoinColumns = {
/*
* mappings -> usersの関係を定義
* name=mappingsテーブルのカラム名
* referencedColumnName=usersテーブルのカラム名
*/
@JoinColumn(name ="user_id", referencedColumnName ="id")
}
)
private List<UserModel> user;
Usage
public interface UserRepository extends JpaRepository<UserModel, Long> {
}
public interface RoleRepository extends JpaRepository<RoleModel, Long> {
}
public class Sample {
private UserRepository userRepository;
private RoleRepository roleRepository;
public void users() {
List<UserModel> users = userRepository.findAll();
// usersのレコードに関連付くrolesテーブルのnameカラムの1つ目を取得
System.out.println(users.get(0).getRoles().get(0).getName());
// usersのレコードに関連付くrolesテーブルのnameカラムの2つ目を取得
System.out.println(users.get(0).getRoles().get(1).getName());
}
public void roles() {
List<RoleModel> role = roleRepository.findAll();
// rolesのレコードに関連付くusersテーブルのnameカラムの1つ目を取得
System.out.println(roles.get(0).getUsers().get(0).getName());
// rolesのレコードに関連付くusersテーブルのnameカラムの2つ目を取得
System.out.println(roles.get(0).getUsers().get(1).getName());
}
}
참고
Reference
이 문제에 관하여([Java] JPA에서 1대N으로 중간 테이블이 있는 DB를 Model에 떨어뜨림), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Esfahan/items/157d4d4170a3f92f5997텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)