В этом учебном пособии будет повторно использована вся инфраструктура предыдущего ” Пример гибернации один к одному – сопоставление XML ” учебника, улучшите его для поддержки аннотации Hibernate/JPA.
Структура проекта
См. окончательную структуру проекта этого руководства.
1. ” Отношение таблицы “один к одному”
Еще раз просмотрите предыдущее отношение таблицы “один к одному”.
2. Класс модели гибернации
Создайте два класса моделей – Stock.java
и StockDetail.java
, и поместите код аннотации внутрь.
Файл: 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; } }
Файл: StockDetail.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. Файл конфигурации гибернации
Помещает аннотированные классы Stock.java
и StockDetail.java
в вашем файле конфигурации гибернации, а также сведения о подключении MySQL.
Файл: hibernate.cfg.xml
com.mysql.jdbc.Driver jdbc:mysql://localhost:3306/mkyongdb root password org.hibernate.dialect.MySQLDialect true
4. Запустите Его
Запустите его, Hibernate вставит строку в таблицу ЗАПАСОВ и строку в таблицу STOCK_DETAIL.
Файл: 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
Ссылка
Оригинал: “https://mkyong.com/hibernate/hibernate-one-to-one-relationship-example-annotation/”