HibernateとJPAのエンティティ間の関係がどのようなものになるかという質問に対する答えは誰もが知っています。オプションは4つだけです。
OneToOne-1対1
OneToMany-1対多
ManyToOne-多対1
ManyToMany-多対多
それぞれの関係には独自の注釈があり、ここで会話を終了できるように見えますが、それほど単純ではありません。とにかく、Hibernateには単純なものがありますか;)上記の関係はそれぞれ単方向または双方向である可能性があり、これを考慮しないと、多くの問題や奇妙なことに直面する可能性があります。
たとえば、ユーザーと連絡先の2つの単純なエンティティを考えてみましょう。明らかに、各連絡先は多対1の関係にあるユーザーに関連付けられており、連絡先に1対多の関係にあるユーザーに関連付けられています。
一方的な関係
一方向の関係とは、2つの当事者のうちの1つだけが所有する関係です。したがって、名前。反対側はこの関係について何も知らないことに注意する必要があります。Hibernateは、リレーションシップアノテーションが配信されるエンティティをリレーションシップの所有者と見なします。
関係の所有者を連絡先側にしてみましょう。エンティティは次のようになります。
@Entity
@Table(name = "contacts")
public class Contact {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column
private String type;
@Column
private String data;
@ManyToOne
private User user;
// , , ..
}
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column
private String username;
// , , ..
}
このコードを実行すると、Hibernateは次のテーブル構造を作成します。これは私たちにとって非常に馴染み深いものです。テーブル間の関係は、連絡先テーブルのuser_id参照フィールドを使用して作成されます。
create table contacts (
id bigint not null auto_increment,
data varchar(255),
type varchar(255),
user_id bigint,
primary key (id)
) engine=InnoDB;
create table users (
id bigint not null auto_increment,
username varchar(128) not null,
primary key (id)
) engine=InnoDB
Contact . , , . . user Contact User. .
@Entity
@Table(name = "contacts")
public class Contact {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column
private String type;
@Column
private String data;
// , , ..
}
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column
private String username;
@OneToMany
private List<Contact> contacts;
// , , ..
}
, , Hibernate , .
create table contacts (
id bigint not null auto_increment,
data varchar(255),
type varchar(255),
primary key (id)
) engine=InnoDB;
create table users (
id bigint not null auto_increment,
username varchar(128) not null,
primary key (id)
) engine=InnoDB;
create table users_contacts (
User_id bigint not null,
contacts_id bigint not null
) engine=InnoDB;
Hibernate (join table) users_contacts, contacts, . , , Hibernate . , - .
JoinColumn contacts.
@OneToMany
@JoinColumn(name = "user_id")
private List<Contact> contacts;
user_id contacts, .
- (owning side) (inverse side). .. . , , . . .
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column
private String username;
@ManyToMany
private List<Role> roles;
// , , ..
}
@Entity
@Table(name = "roles")
public class Role {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column
private String name;
@ManyToMany
private List<User> users;
// , , ..
}
. Hibernate , .
create table roles_users (
Role_id bigint not null,
users_id bigint not null
) engine=InnoDB;
create table users_roles (
User_id bigint not null,
roles_id bigint not null
) engine=InnoDB;
, . . Hibernate , , , . mappedBy. , , .
. . users Role .
// mappedBy - -
@ManyToMany(mappedBy = "roles")
private List<User> users;
Hibernate users_roles.
. , - (many), mappedBy @OneToMany
. ( Contact).
@Entity
@Table(name = "contacts")
public class Contact {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column
private String type;
@Column
private String data;
@ManyToOne
private User user;
// , , ..
}
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column
private String username;
@OneToMany(mappedBy = "user")
private List<Contact> contacts;
// , , ..
}
Hibernate .
! , , ! , !
おそらく続編があるでしょう!