hibernate
エンティティ間のアソシエーションマッピング
サーチ…
OneToManyアソシエーション
関係OneToManyを説明するために、2つのエンティティ、たとえば国と都市が必要です。ある国には複数の都市があります。
以下のCountryEntityには、Countryの都市セットが定義されています。
@Entity
@Table(name = "Country")
public class CountryEntity implements Serializable
{
private static final long serialVersionUID = 1L;
@Id
@Column(name = "COUNTRY_ID", unique = true, nullable = false)
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Integer countryId;
@Column(name = "COUNTRY_NAME", unique = true, nullable = false, length = 100)
private String countryName;
@OneToMany(mappedBy="country", fetch=FetchType.LAZY)
private Set<CityEntity> cities = new HashSet<>();
//Getters and Setters are not shown
}
今、市の実体。
@Entity
@Table(name = "City")
public class CityEntity implements Serializable
{
private static final long serialVersionUID = 1L;
@Id
@Column(name = "CITY_ID", unique = true, nullable = false)
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Integer cityId;
@Column(name = "CITY_NAME", unique = false, nullable = false, length = 100)
private String cityName;
@ManyToOne(optional=false, fetch=FetchType.EAGER)
@JoinColumn(name="COUNTRY_ID", nullable=false)
private CountryEntity country;
//Getters and Setters are not shown
}
XMLを使用した1対多の関連付け
これは、XMLを使用して1対多のマッピングを実行する方法の例です。著者と書籍を例として使用し、著者が多くの書籍を書いていると仮定しますが、各書籍には1人の著者しかいません。
著者クラス:
public class Author {
private int id;
private String firstName;
private String lastName;
public Author(){
}
public int getId(){
return id;
}
public void setId(int id){
this.id = id;
}
public String getFirstName(){
return firstName;
}
public void setFirstName(String firstName){
this.firstName = firstName;
}
public String getLastName(){
return lastName;
}
public void setLastName(String lastName){
this.lastName = lastName;
}
}
ブッククラス:
public class Book {
private int id;
private String isbn;
private String title;
private Author author;
private String publisher;
public Book() {
super();
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getIsbn() {
return isbn;
}
public void setIsbn(String isbn) {
this.isbn = isbn;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public Author getAuthor() {
return author;
}
public void setAuthor(Author author) {
this.author = author;
}
public String getPublisher() {
return publisher;
}
public void setPublisher(String publisher) {
this.publisher = publisher;
}
}
Author.hbm.xml:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping>
<class name="Author" table="author">
<meta attribute="class-description">
This class contains the author's information.
</meta>
<id name="id" type="int" column="author_id">
<generator class="native"/>
</id>
<property name="firstName" column="first_name" type="string"/>
<property name="lastName" column="last_name" type="string"/>
</class>
</hibernate-mapping>
Book.hbm.xml:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping>
<class name="Book" table="book_title">
<meta attribute="class-description">
This class contains the book information.
</meta>
<id name="id" type="int" column="book_id">
<generator class="native"/>
</id>
<property name="isbn" column="isbn" type="string"/>
<property name="title" column="title" type="string"/>
<many-to-one name="author" class="Author" cascade="all">
<column name="author"></column>
</many-to-one>
<property name="publisher" column="publisher" type="string"/>
</class>
</hibernate-mapping>
1対多数の接続を作るのは、BookクラスにAuthorが含まれ、XMLに<many-to-one>タグがあることです。カスケード属性を使用すると、子エンティティの保存/更新方法を設定できます。
Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow