休止状態 – 1対1の例(注釈)
このチュートリアルでは、以前の ”
Hibernate 1対1の関係の例 – XMLマッピング
“チュートリアルのインフラストラクチャ全体を再利用して、 Hibernate/JPAアノテーション
プロジェクト構造
このチュートリアルの最終的なプロジェクト構造を参照してください。
1.「1対1」のテーブル関係
前の1対1テーブル関係を再度参照してください。
2. Hibernateモデルクラス
Stock.java`と
StockDetail.java`の2つのモデルクラスを作成し、注釈コードを内部に配置します。
File:Stock.java
package com.mkyong.stock; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import static javax.persistence.GenerationType.IDENTITY; import javax.persistence.Id; import javax.persistence.OneToOne; import javax.persistence.Table; import javax.persistence.UniqueConstraint; @Entity @Table(name = "stock", catalog = "mkyongdb", uniqueConstraints = { @UniqueConstraint(columnNames = "STOCK__NAME"), @UniqueConstraint(columnNames = "STOCK__CODE") }) public class Stock implements java.io.Serializable { private Integer stockId; private String stockCode; private String stockName; private StockDetail stockDetail; public Stock() { } public Stock(String stockCode, String stockName) { this.stockCode = stockCode; this.stockName = stockName; } public Stock(String stockCode, String stockName, StockDetail stockDetail) { this.stockCode = stockCode; this.stockName = stockName; this.stockDetail = stockDetail; } @Id @GeneratedValue(strategy = IDENTITY) @Column(name = "STOCK__ID", unique = true, nullable = false) public Integer getStockId() { return this.stockId; } public void setStockId(Integer stockId) { this.stockId = stockId; } @Column(name = "STOCK__CODE", unique = true, nullable = false, length = 10) public String getStockCode() { return this.stockCode; } public void setStockCode(String stockCode) { this.stockCode = stockCode; } @Column(name = "STOCK__NAME", unique = true, nullable = false, length = 20) public String getStockName() { return this.stockName; } public void setStockName(String stockName) { this.stockName = stockName; } @OneToOne(fetch = FetchType.LAZY, mappedBy = "stock", cascade = CascadeType.ALL) public StockDetail getStockDetail() { return this.stockDetail; } public void setStockDetail(StockDetail stockDetail) { this.stockDetail = stockDetail; } }
ファイル:Stock Detail.java
package com.mkyong.stock; import java.util.Date; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.OneToOne; import javax.persistence.PrimaryKeyJoinColumn; import javax.persistence.Table; import javax.persistence.Temporal; import javax.persistence.TemporalType; import org.hibernate.annotations.GenericGenerator; import org.hibernate.annotations.Parameter; @Entity @Table(name = "stock__detail", catalog = "mkyongdb") public class StockDetail implements java.io.Serializable { private Integer stockId; private Stock stock; private String compName; private String compDesc; private String remark; private Date listedDate; public StockDetail() { } public StockDetail(Stock stock, String compName, String compDesc, String remark, Date listedDate) { this.stock = stock; this.compName = compName; this.compDesc = compDesc; this.remark = remark; this.listedDate = listedDate; } @GenericGenerator(name = "generator", strategy = "foreign", parameters = @Parameter(name = "property", value = "stock")) @Id @GeneratedValue(generator = "generator") @Column(name = "STOCK__ID", unique = true, nullable = false) public Integer getStockId() { return this.stockId; } public void setStockId(Integer stockId) { this.stockId = stockId; } @OneToOne(fetch = FetchType.LAZY) @PrimaryKeyJoinColumn public Stock getStock() { return this.stock; } public void setStock(Stock stock) { this.stock = stock; } @Column(name = "COMP__NAME", nullable = false, length = 100) public String getCompName() { return this.compName; } public void setCompName(String compName) { this.compName = compName; } @Column(name = "COMP__DESC", nullable = false) public String getCompDesc() { return this.compDesc; } public void setCompDesc(String compDesc) { this.compDesc = compDesc; } @Column(name = "REMARK", nullable = false) public String getRemark() { return this.remark; } public void setRemark(String remark) { this.remark = remark; } @Temporal(TemporalType.DATE) @Column(name = "LISTED__DATE", nullable = false, length = 10) public Date getListedDate() { return this.listedDate; } public void setListedDate(Date listedDate) { this.listedDate = listedDate; } }
3.ハイバネート設定ファイル
Hibernate設定ファイルに注釈付きクラス
Stock.java`と
StockDetail.java`を置きます。また、MySQL接続の詳細も入れます。
File:hibernate.cfg.xml
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="hibernate.connection.driver__class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/mkyongdb</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">password</property> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <property name="show__sql">true</property> <mapping class="com.mkyong.stock.Stock"/> <mapping class="com.mkyong.stock.StockDetail"/> </session-factory> </hibernate-configuration>
4.それを実行する
これを実行すると、HibernateはSTOCKテーブルに行を挿入し、STOCK__DETAILテーブルに行を挿入します。
File:App.java
package com.mkyong; import java.util.Date; import org.hibernate.Session; import com.mkyong.stock.Stock; import com.mkyong.stock.StockDetail; import com.mkyong.util.HibernateUtil; public class App { public static void main(String[]args) { System.out.println("Hibernate one to one (Annotation)"); Session session = HibernateUtil.getSessionFactory().openSession(); session.beginTransaction(); Stock stock = new Stock(); stock.setStockCode("7052"); stock.setStockName("PADINI"); StockDetail stockDetail = new StockDetail(); stockDetail.setCompName("PADINI Holding Malaysia"); stockDetail.setCompDesc("one stop shopping"); stockDetail.setRemark("vinci vinci"); stockDetail.setListedDate(new Date()); stock.setStockDetail(stockDetail); stockDetail.setStock(stock); session.save(stock); session.getTransaction().commit(); System.out.println("Done"); } }
出力
Hibernate one to one (Annotation) Hibernate: insert into mkyongdb.stock (STOCK__CODE, STOCK__NAME) values (?, ?) Hibernate: insert into mkyongdb.stock__detail (COMP__DESC, COMP__NAME, LISTED__DATE, REMARK, STOCK__ID) values (?, ?, ?, ?, ?) Done
それをダウンロードしてください://wp-content/uploads/2011/04/Hibernate-one-to-one-annotation.zip[Hibernate-one-to-one-annotation、zip](9KB)
リファレンス
ドキュメンテーション – 1対1の関係]