Композитное отображение первичного ключа требует использования тега <composite-id> в файле конфигурации сопоставления. Этот тег ссылается на указание класса как соответствующий составной первичный ключ. Его атрибут имени необходимо указать значение свойства, определенное в файле класса, и добавить субпользовательскую марку <клавиша Property> к тегу.
Примечание. Если вы хотите использовать композитное отображение, вы должны разместить композитный первичный ключ в одном классе, то есть составные атрибуты первичного ключа и другие атрибуты делятся на два класса, а класс композитного первичного ключа реализует сериализуемый интерфейс, который принадлежит Java.io.
Основной ключ отношения отображения композитного первичного ключа состоит из нескольких столбцов, что соответствует таблице данных довольно просто, как показано на рисунке ниже:
1. Файлы класса
Здесь мы берем таблицу на рисунке выше в качестве примера. В таблице два поля и продолжительность объединяются, чтобы сформировать первичный ключ таблицы. Следовательно, новые разделенные классы называются FiscalyArperiod и FiscalyArPerioDPK соответственно. Среди них класс FiscalyArperiod инкапсулирует первичные ключевые атрибуты таблицы, класс FiscalyArperiod инкапсулирует другие атрибуты и класс FiscalyArPeriod.
1.1 FiscalyArperiod.java
Класс инкапсулирует основные свойства и инкапсулирует класс FiscalyearPerioDPK в качестве атрибутов в класс и настраивает соответствующее отображение в файле конфигурации следующим образом:
пакет com.src.hibernate; импортировать java.sql.date; Public Class FiscalyArperiod {// время первичного ключа частного FiscalyArPerioDpk fiscalyearPerioDpk; public fiscalyearperiodpk getfiscalyearperiodpk () {return fiscalyearperiodpk; } public void setFiscalyArPerioDPK (fiscalyearPeriodpk fiscalyearPerioDpk) {this.fiscalyearperiodpk = fiscalyearperiodpk; } // Дата начала частная дата начала; Общественная дата getBegindate () {return begindate; } public void setBegIndate (дата начала) {this.begindate = begindate; } // Дата окончания частной даты конечный дат; публичная дата getEnddate () {return enddate; } public void setendDate (date enddate) {this.endDate = endDate; } // Стадия времени частной строки Poirsts; public String getPerioDsts () {return poirsts; } public void setPerioDSTS (String poinsts) {this.PerioDSTS = poirsts; }} 1.2 FiscalyearPeriodpk.java
Инкапсулировать атрибут первичного ключа. Этот класс отделен от класса FiscalyArperiod. Он содержит основные атрибуты первичного ключа и необходимо реализовать интерфейс -сериализуемый. Этот класс должен быть сопоставлен с тегом <composite-id> в файле конфигурации, чтобы указать класс. Код заключается в следующем:
пакет com.src.hibernate; импортировать java.io.serializable; Public Class FiscalyearPeriodpk реализует Serializable {// год Private Int Fiscalyear; public int getFiscalyear () {return fiscalyear; } public void setFiscalyear (int fiscalyear) {this.fiscalyear = fiscalyear; } // Продолжительность частного фискальпериода; public int getfiscalperiod () {return fiscalperiod; } public void setFiscalPeriod (int fiscalperiod) {this.fiscalperiod = fiscalperiod; }} 2. Файл конфигурации
Вот вопрос, какой из двух классов должен добавить файлы отображения? Поскольку используется тег <composite-id>, вам нужно только добавить отображение для класса FiscalyearPeriod, добавьте соответствующий композитный тег первичной клавиши в файл отображения и добавьте соответствующие атрибуты первичной клавиши в тег следующим образом:
<? xml version = "1.0"?> <! Doctype Hibernate Mapping Public "-// Hibernate/Hibernate Mapping Dtd 3.0 // en" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name nela nela nelably = "com.sr.src.shivicerate.bisiodate. table="t_fiscal_year_period_pk"> <composite-id name="fiscalYearPK"> <key-property name="fiscalYear"></key-property> <key-property name="fiscalPeriod"></key-property> </composite-id> <property name="beginDate" type="date"/> <property name="endDate" type="date"/> <имя свойства = "enddate" type = "date"/> <name = "periorsts"/> </class> </hibernate-mapping>
Приведенный выше файл генерируется для генерации соответствующей таблицы баз данных, а сгенерированный оператор SQL выглядит следующим образом:
Таблица сброса, если существует T_FISCAL_YEAR_PERIOD_PK CREATE TABLE T_FISCAL_YEAR_PERIOD_PK (Fiscalyear Integer, не нулевая, фискальпериод целое число, не нулевая, дата начала, дата конечной даты, периоды Varchar (255), первичный ключ (Fiscalyear, FiscalPeriod))
Соответствующая структура таблицы следующая:
3. Операция данных
После настроения соответствующего отображающегося файла, соответствующая операция данных становится очень простой. Во -первых, начните с написания данных. При написании данных в базу данных два класса будут записаны в базу данных одновременно. Следовательно, оба класса должны быть преобразованы в переходное состояние. Поэтому при сохранении необходимо сначала сохранить объект FiscalyArPeriod в базе данных, а затем он автоматически связывает составные атрибуты и сохраняет информацию в базе данных.
3.1 Операция записи
Метод операции записи такой же, как и предыдущий метод записи. Вам необходимо определить два объекта, а затем сохранить соответствующую информацию объекта в базе данных. Код заключается в следующем:
public void testSave1 () {// объявить сеанс объекта сеанса = null; try {// получить сеанс сеанса Session = hibernateutils.getSession (); // открыть сеанс сеанса.beginTransaction (); // Создать композитный объект fiscalyearperiodpk fiscalyearperiodpk = new fiscalyearperiodpk (); fiscalyearperiodpk.setfiscalperiod (2014); fiscalyearperiodpk.setfiscalyearyear (2012); // Создать объект FiscalyArperiod fiscalyearPeriod = new FiscalyArPeriod (); fiscalyearperiod.setfiscalyearperiodpk (fiscalyearperiodpk); Session.save (FiscalyArperiod); // отправить сеанс сеанс сеанса.getTransaction (). Commit (); } catch (Exception e) {e.printstackTrace (); session.getTransaction (). Rollback (); } наконец {hibernateutils.closesession (Session); }}Выполните соответствующий метод испытаний, и сгенерированный оператор SQL выглядит следующим образом:
Hibernate: insert into t_fiscal_year_period_pk (beginDate, endDate, periodSts, fiscalYear, fiscalPeriod) values (?, ?, ?, ?, ?) Соответствующее представление базы данных:
3.2 Загрузка
Соответствующий метод загрузки будет отличаться от ранее, потому что основной ключ в таблице представляет собой составное свойство, поэтому необходимо создать класс. При загрузке данных необходимо создать объект первичного ключа. В настоящее время основной ключ является объектом, и вам необходимо присвоить значения свойствам объекта для получения объекта. Код заключается в следующем:
public void testload1 () {// объявить сеанс объекта сеанса = null; try {// получить сеанс сеанса Session = hibernateutils.getSession (); // открыть сеанс сеанса.beginTransaction (); // Создать композитный объект fiscalyearperiodpk fiscalyearperiodpk = new fiscalyearperiodpk (); fiscalyearperiodpk.setfiscalperiod (2014); fiscalyearperiodpk.setfiscalyear (2012); Fiscalyearperiod fiscalyearperiod = (fiscalyearperiod). Нагрузка (fiscalyearperiod.class, fiscalyearperiodpk); System.out.println («Дата начала:»+fiscalyearperiod.getbegindate ()); // отправить сеанс сеанса.getTransaction (). Commit (); } catch (Exception e) {e.printstackTrace (); session.getTransaction (). Rollback (); } наконец {hibernateutils.closesession (Session); }}Результат заключается в следующем:
Hibernate: выберите fiscalyear0_.fiscalyear as fiscalyear0_0_, fiscalyear0_.fiscalperiod как fiscalpe2_0_0_, fiscalyear0_.begindate as betindate0_0_, fiscalyear0_.enddate as enddate0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_. T_FISCAL_YEAR_PERIOD_PK FISCALYEAR0_ где fiscalyear0_.fiscalyear =? и fiscalyear0_.fiscalperiod =? Дата начала: 2013-10-12
4. Комплексные примеры
Таблица отделения более крупной компании (Hibernate_Dept_compositepk) состоит из таких областей, как область (район), название отделения (имя), количество людей в департаменте (EMPCOUNT) и время учреждения (день рождения). Мы используем название области и отдела в качестве совместного первичного ключа:
4.1 Целевой класс: отдел. Java
Отдел открытого класса { /** Аннотация Атрибут первичной ассоциации ключей и напишите его в класс отдельно* /// частная строковая область; // частное имя строки; / ** Подготовка объекта класса первичного ключа в качестве переменной участника*/ private DepartmentPK DepartmentPK; Частный int empcount; частное свидание по случаю дня рождения; // public String getarea () {// return Area; //} // // public void setarea (string rea) {// this.area = area; //} // // public String getName () {// return name; //} // // public void setName (string name) {// this.name = name; //} public int getempcount () {return empcount; } public void setEmpCount (int empCount) {this.empCount = empcount; } public date getBirthDay () {return Birthday; } public void setBirthDay (дата рождения) {this.BirthDay = день рождения; } public DepartmentPK getDepartmentpk () {return depalepk; } public void setDepartmentPK (DepartmPk DepartmentPK) {this.departmentpk = departspk; }} 4.2 Первичный ключ класс: отдел. Java
Общедоступный класс DepartmentPK реализует Serializable {Private Static Long Long SerialVersionUID = -2880028559152042555; частная струнная зона; Приватное название строки; /** * Перезаписать метод хэшкода (оценивается на основе области и имени) *///@переопределить public int hashcode () {final int prime = 31; int result = 1; result = prime * result + ((область == null)? 0: area.hashcode ()); result = prime * result + ((имя == null)? 0: name.hashcode ()); результат возврата; } / ** * перезапись равна (судя по площади и имени) * / @@override public boolean equals (Object obj) {if (this == obj) возвращает true; if (obj == null) вернуть false; if (getClass ()! = obj.getClass ()) вернуть false; Окончательный отдел DepartyPK Другое = (Департамент) OBJ; if (rea == null) {if (shry.area! = null) вернуть false; } else if (! gree.equals (ore.area)) вернуть false; if (name == null) {if (ore.name! = null) вернуть false; } else if (! name.equals (ore.name)) вернуть false; вернуть истину; } public String getarea () {return Area; } public void setarea (String Area) {this.area = area; } public String getName () {return name; } public void setName (string name) {this.name = name; }} 4.3 MAPPING FILE DEPARTH.HBM.XML
<? xml version = "1.0"?> <! Doctype Hibernate Mapping Public "-// Hibernate/Hibernate Mapping Dtd 3.0 // en" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" name="com.yangfei.hibernate.compositePk.entity.Department" table="hibernate_dept_compositePK"> <!-- Union primary key--> <!-- name refers to primary key object attributes--> <composite-id name="departmentPK"> <!-- Here is the primary key association property --> <key-property name="area" /> <key-property name="name" /> < /composite-id> <!-Другие свойства-> <Свойство name = "empcount" length = "4" /> <name = "name =" dirthday "type =" date " /> < /class> < /hibernate mapping>
4.4 Файл конфигурации Hibernate hibernate.cfg.xml
<? xml version = '1.0' Encoding = 'UTF-8'?> <! Doctype Hibernate-Configuration public "-// Hibernate/Hibernate Configuration dtd 3.0 // en" "http://hibernate.sourceforge.net/hibernate configuration-3.0.dtd"> <! -> <Hibernate-Configuration> <session-factory> <свойство name = "dialect"> org.hibernate.dialect.oracle9dialect </property> <name = "connection.url"> jdbc: Oracle: thin:@127.0.0.1: 1521: orcl10 </propetion> <name = "connection. name = "connection.password"> yf123 </property> <name = "connection.driver_class"> oracle.jdbc.driver.oracledriver </property> <name = "hibernate.show_sql"> true </property> <mapping resource = "com/yangfei/hibernate/compositepk/entity/departy.h. </session-factory> </hibernate-configuration>
4.5 Тестовый класс: DepartyTest.java
открытый класс DepartyTest Extends TestCase { / *** Test Insert Data* / public void said () {session session = hibernateutils.getSession (); Транзакция t = session.beginTransaction (); try {depart dept = new Department (); / ** Сгенерировать объект первичного ключа*/ departpk deptpk = new Departypk (); deptpk.setarea ("Пекин"); deptpk.setname («Отдел исследований и разработок»); Dept.SetDepartmentPK (DEPTPK); dept.setempcount (100); Dept.SetBirthDay (New Date ()); Session.save (Dept); t.commit (); } catch (hibernateexception e) {e.printstacktrace (); t.rollback (); } наконец {hibernateutils.closesession (Session); }} / *** Данные тестовой нагрузки* / public void load () {session session = hibernateutils.getSession (); Транзакция t = session.beginTransaction (); try { / ** Сгенерировать объект первичного ключа* / departpk deptpk = new DepartyPK (); deptpk.setarea ("Пекин"); deptpk.setname («Отдел исследований и разработок»); Департамент dept = (отдел) сессия. Загрузка (Department.class, DEPTPK); System.out.println (dept.getDepartmentpk (). Getarea ()+","+dept.getDepartmentpk (). GetName ()+","+dept.getEmpcount ()+","+dept.getBirthDay ()); } catch (hibernateexception e) {e.printstacktrace (); t.rollback (); } наконец {hibernateutils.closesession (Session); }} / *** Данные модификации теста* / public void update () {session session = hibernateutils.getSession (); Транзакция t = session.beginTransaction (); try { / ** Сгенерировать объект первичного ключа* / departpk deptpk = new DepartyPK (); deptpk.setarea ("Пекин"); deptpk.setname («Отдел исследований и разработок»); Департамент EMP = (отдел) Сессия. Загрузка (Department.class, DEPTPK); System.out.println (emp.getDepartmentpk (). Getarea ()+","+emp.getDepartmentpk (). GetName ()+","+emp.getempcount ()+","+emp.getBirthDay ()); emp.setempcount (100); session.saveorupdate (emp); / ** Сгенерировать объект первичного ключа*/ DepartyPK deptpk2 = new DepartyPK (); deptpk2.setarea ("Пекин"); deptpk2.setname («Отдел исследований и разработок»); Департамент dept = (отдел) сессия. Загрузка (Department.class, deptpk2); System.out.println (dept.getDepartmentpk (). Getarea ()+","+dept.getDepartmentpk (). GetName ()+","+dept.getEmpcount ()+","+dept.getBirthDay ()); t.commit (); } catch (hibernateexception e) {e.printstacktrace (); t.rollback (); } наконец {hibernateutils.closesession (Session); }} / *** Тест удалить данные* / public void lelete () {session = hibernateutils.getSession (); Транзакция t = session.beginTransaction (); try { / ** Сгенерировать объект первичного ключа* / departpk deptpk = new DepartyPK (); deptpk.setarea ("Пекин"); deptpk.setname («Отдел исследований и разработок»); Департамент dept = (отдел) сессия. Загрузка (Department.class, DEPTPK); session.delete (Dept); t.commit (); } catch (hibernateexception e) {e.printstacktrace (); t.rollback (); } наконец {hibernateutils.closesession (Session); }}}