SpringData JPAにおけるテーブルの関連付け
このブログは暇で、自分で勝手に書いて遊んでいます.の異なる関連関係におけるエンティティクラスの書き方を簡単に列挙するだけです.
まず、OrderとCustomerの2つのエンティティクラスを1対1にします.
1対多:
複数のペアに注意してください.保存するときは、関連付けられていない側、つまり外部キーのない側を保存してから、別のクラスのsetメソッドを呼び出して、外部キーのない側を属性に追加してから保存します.
最後に、双方向の多対多の関係である、関連関係を維持しないroleテーブル、例えばrole 1とrole 2を保存してからuser 1を保存すべきである.setRoles(new HashSet<>().add(role1).add(role 2))、user 1を再保存し、user_rolesテーブルに関連データを挿入し、逆に無理です(間違えるのが怖いなら、そのままuserにroles集合を付けてroleにusers集合を入れておけば間違いないと思いますが、これではよくないと思います.そうするには、すべてのrole依存のusersを入れなければならないので、それからusersにそれぞれのuser依存のすべてのrolesを入れなければなりません.あまりにも回りくどいことを言って、自分でやってみれば分かります):
まず、OrderとCustomerの2つのエンティティクラスを1対1にします.
package com.sunsy.jpatest.entity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
@Table(name="JPA_ORDERS")
@Entity
public class Order {
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Id
private Integer id;
@Column(name="ORDER_NAME")
private String orderName;
@JoinColumn(name="CUSTOMER_ID")
@ManyToOne(fetch=FetchType.LAZY)
private Customer customer;
//get set
}
package com.sunsy.jpatest.entity;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Table(name="JPA_CUSTOMER")
@Entity
public class Customer {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="CUSTOMER_ID")
private Integer id;
private String lastName;
private String email;
private int age;
private Date createTime;
private Date birth;
}
1対多:
package com.sunsy.jpatest.entity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
@Table(name="JPA_ORDERS")
@Entity
public class Order {
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Id
private Integer id;
@Column(name="ORDER_NAME")
private String orderName;
}
package com.sunsy.jpatest.entity;
import java.util.Date;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.Table;
@Table(name="JPA_CUSTOMER")
@Entity
public class Customer {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="CUSTOMER_ID")
private Integer id;
private String lastName;
private String email;
private int age;
private Date createTime;
private Date birth;
// Casade , customer.setOrders(Set<> orders) , customer orders , 、
@OneToMany(cascade=CascadeType.ALL)
@JoinColumn(name="CUSTOMER_ID")
private Set orders;
}
複数のペアに注意してください.保存するときは、関連付けられていない側、つまり外部キーのない側を保存してから、別のクラスのsetメソッドを呼び出して、外部キーのない側を属性に追加してから保存します.
package com.sunsy.jpatest.entity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToOne;
import javax.persistence.Table;
@Table(name="JPA_MANAGERS")
@Entity
public class Manager {
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Id
private Integer id;
@Column(name="MGR_NAME")
private String mgrName;
// , , mappedBy, Dept 。
// , update
@OneToOne(mappedBy="mgr")
private Department dept;
}
package com.sunsy.jpatest.entity;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Table;
@Entity
@Table(name="JPA_DEPTS")
public class Department {
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Id
private Integer id;
@Column(name="DEPT_NAME")
private String deptName;
@OneToOne
@JoinColumn(name="MGRa_ID", unique=true)
private Manager mgr;
}
最後に、双方向の多対多の関係である、関連関係を維持しないroleテーブル、例えばrole 1とrole 2を保存してからuser 1を保存すべきである.setRoles(new HashSet<>().add(role1).add(role 2))、user 1を再保存し、user_rolesテーブルに関連データを挿入し、逆に無理です(間違えるのが怖いなら、そのままuserにroles集合を付けてroleにusers集合を入れておけば間違いないと思いますが、これではよくないと思います.そうするには、すべてのrole依存のusersを入れなければならないので、それからusersにそれぞれのuser依存のすべてのrolesを入れなければなりません.あまりにも回りくどいことを言って、自分でやってみれば分かります):
package com.sunsy.jpatest.entity;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
@Entity
@Table(name="JPA_USERS")
public class User {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;
private String userName;
@JoinTable(name="user_roles", joinColumns={@JoinColumn(name="USER_ID", referencedColumnName="id")},
inverseJoinColumns= {@JoinColumn(name="ROLE_ID", referencedColumnName="id")})
@ManyToMany
private Set roles;
}
package com.sunsy.jpatest.entity;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
@Entity
@Table(name="JPA_ROLES")
public class Role {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;
private String roleName;
@ManyToMany(mappedBy="roles")
private Set users = new HashSet<>();
}