Hibernate - пример «один ко многим» (сопоставление XML)

Hibernate - пример «один ко многим» (сопоставление XML)

Отношение «один ко многим» возникает, когда один объект связан со многими вхождениями другого объекта.

В этом учебном пособии мы покажем вам, как работать с табличными отношениями «один ко многим» в Hibernate, с помощью файла сопоставления XML (hbm).

Инструменты и технологии, используемые в этих уроках:

  1. Hibernate 3.6.3.Final

  2. MySQL 5.1.15

  3. Maven 3.0.3

  4. Затмение 3.6

Структура проекта

Структура проекта этого урока.

one to many folder

Зависимость проекта

Получитеhibernate.jar из репозитория JBoss, Maven позаботится обо всех связанных зависимостях за вас

Файл: pom.xml



    
        
            JBoss repository
            http://repository.jboss.org/nexus/content/groups/public/
        
    

    

        
        
            mysql
            mysql-connector-java
            5.1.15
        

        
            org.hibernate
            hibernate-core
            3.6.3.Final
        

        
            javassist
            javassist
            3.12.1.GA
        

    

1. Пример «один ко многим»

Это дизайн таблицы отношенийone-to-many, таблица STOCK имеет много экземпляров таблицы STOCK_DAILY_RECORD.

one to many table relationship

Смотрите сценарии таблицы MySQL

DROP TABLE IF EXISTS `stock`;
CREATE TABLE `stock` (
  `STOCK_ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `STOCK_CODE` varchar(10) NOT NULL,
  `STOCK_NAME` varchar(20) NOT NULL,
  PRIMARY KEY (`STOCK_ID`) USING BTREE,
  UNIQUE KEY `UNI_STOCK_NAME` (`STOCK_NAME`),
  UNIQUE KEY `UNI_STOCK_ID` (`STOCK_CODE`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=34 DEFAULT CHARSET=utf8;


DROP TABLE IF EXISTS `exampledb`.`stock_daily_record`;
CREATE TABLE  `exampledb`.`stock_daily_record` (
  `RECORD_ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `PRICE_OPEN` float(6,2) DEFAULT NULL,
  `PRICE_CLOSE` float(6,2) DEFAULT NULL,
  `PRICE_CHANGE` float(6,2) DEFAULT NULL,
  `VOLUME` bigint(20) unsigned DEFAULT NULL,
  `DATE` date NOT NULL,
  `STOCK_ID` int(10) unsigned NOT NULL,
  PRIMARY KEY (`RECORD_ID`) USING BTREE,
  UNIQUE KEY `UNI_STOCK_DAILY_DATE` (`DATE`),
  KEY `FK_STOCK_TRANSACTION_STOCK_ID` (`STOCK_ID`),
  CONSTRAINT `FK_STOCK_TRANSACTION_STOCK_ID` FOREIGN KEY (`STOCK_ID`)
  REFERENCES `stock` (`STOCK_ID`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=36 DEFAULT CHARSET=utf8;

2. Спящий модельный класс

Создайте два класса модели -Stock.java иStockDailyRecord.java, чтобы представить приведенные выше таблицы.

Файл: Stock.java

package com.example.stock;

import java.util.HashSet;
import java.util.Set;

public class Stock implements java.io.Serializable {

    private Integer stockId;
    private String stockCode;
    private String stockName;
    private Set stockDailyRecords =
                new HashSet(0);

    //getter, setter and constructor
}

Файл: StockDailyRecord.java

package com.example.stock;

import java.util.Date;

public class StockDailyRecord implements java.io.Serializable {

    private Integer recordId;
    private Stock stock;
    private Float priceOpen;
    private Float priceClose;
    private Float priceChange;
    private Long volume;
    private Date date;

    //getter, setter and constructor
}

3. Hibernate XML Mapping

Теперь создайте два файла отображения Hibernate (hbm) -Stock.hbm.xml иStockDailyRecord.hbm.xml.

Файл: Stock.hbm.xml




    
        
            
            
        
        
            
        
        
            
        
        
            
                
            
            
        
    

Файл: StockDailyRecord.hbm.xml




    
        
            
            
        
        
            
        
        
            
        
        
            
        
        
            
        
        
            
        
        
            
        
    

4. Файл конфигурации Hibernate

ПомещаетStock.hbm.xml иStockDailyRecord.hbm.xml в ваш файл конфигурации Hibernate, а также детали соединения MySQL.

Файл: hibernate.cfg.xml






    com.mysql.jdbc.Driver
    jdbc:mysql://localhost:3306/exampledb
    root
    password
    org.hibernate.dialect.MySQLDialect
    true
    true
    
    

5. Запустить его

Запустите его, Hibernate вставит строку в таблицу STOCK и строку в таблицу STOCK_DAILY_RECORD.

Файл: App.java

package com.example;

import java.util.Date;

import org.hibernate.Session;

import com.example.stock.Stock;
import com.example.stock.StockDailyRecord;
import com.example.util.HibernateUtil;

public class App {
    public static void main(String[] args) {

        System.out.println("Hibernate one to many (XML Mapping)");
    Session session = HibernateUtil.getSessionFactory().openSession();

    session.beginTransaction();

    Stock stock = new Stock();
        stock.setStockCode("7052");
        stock.setStockName("PADINI");
        session.save(stock);

        StockDailyRecord stockDailyRecords = new StockDailyRecord();
        stockDailyRecords.setPriceOpen(new Float("1.2"));
        stockDailyRecords.setPriceClose(new Float("1.1"));
        stockDailyRecords.setPriceChange(new Float("10.0"));
        stockDailyRecords.setVolume(3000000L);
        stockDailyRecords.setDate(new Date());

        stockDailyRecords.setStock(stock);
        stock.getStockDailyRecords().add(stockDailyRecords);

        session.save(stockDailyRecords);

    session.getTransaction().commit();
    System.out.println("Done");
    }
}

Вывод …

Hibernate one to many (XML Mapping)
Hibernate:
    insert
    into
        exampledb.stock
        (STOCK_CODE, STOCK_NAME)
    values
        (?, ?)
Hibernate:
    insert
    into
        exampledb.stock_daily_record
        (STOCK_ID, PRICE_OPEN, PRICE_CLOSE, PRICE_CHANGE, VOLUME, DATE)
    values
        (?, ?, ?, ?, ?, ?)

Hibernate Annotation
Для аннотации «один ко многим» в аннотации Hibernate см. этотexample.

Скачать -Hibernate-one-to-many-xml-mapping.zip (10 КБ)