مثال تعليمي لتعيين واحد إلى واحد في Hibernate Annotation

اليوم سنتطلع على تعيين واحد إلى واحد في Hibernate. سنتطلع على مثال تعيين واحد إلى واحد في Hibernate باستخدام التعليق وتكوين XML.

تعيين واحد إلى واحد في Hibernate

في معظم الأحيان، تكون جداول قاعدة البيانات مرتبطة ببعضها البعض. هناك العديد من أشكال الارتباط – واحد-إلى-واحد، واحد-إلى-عديد و عديد-إلى-عديد على المستوى العريض. يمكن تقسيمها إلى مزيد من التعيينات غير الثنائية والثنائية. اليوم سنتطلع على تنفيذ تعيين واحد إلى واحد في Hibernate باستخدام تكوين XML واستخدام تكوين التعليق.

مثال تعيين واحد إلى واحد في Hibernate – إعداد قاعدة البيانات

أولاً، سنحتاج إلى إعداد تعيين واحد إلى واحد في جداول قاعدة البيانات. سنقوم بإنشاء جدولين لهذا المثال – جدول المعاملات وجدول العملاء. كلا هذين الجدولين سيكون لهما تعيين واحد إلى واحد. سيكون جدول المعاملات هو الجدول الأساسي وسنستخدم مفتاح خارجي في جدول العملاء لتعيين واحد إلى واحد. أنا أقدم نص MySQL ، وهو قاعدة البيانات التي أستخدمها في هذا البرنامج التعليمي. إذا كنت تستخدم قاعدة بيانات أخرى ، فتأكد من تغيير البرنامج النصي وفقًا لذلك.

-- إنشاء جدول المعاملات
CREATE TABLE `Transaction` (
  `txn_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `txn_date` date NOT NULL,
  `txn_total` decimal(10,0) NOT NULL,
  PRIMARY KEY (`txn_id`)
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8;

-- إنشاء جدول العملاء
CREATE TABLE `Customer` (
  `txn_id` int(11) unsigned NOT NULL,
  `cust_name` varchar(20) NOT NULL DEFAULT '',
  `cust_email` varchar(20) DEFAULT NULL,
  `cust_address` varchar(50) NOT NULL DEFAULT '',
  PRIMARY KEY (`txn_id`),
  CONSTRAINT `customer_ibfk_1` FOREIGN KEY (`txn_id`) REFERENCES `Transaction` (`txn_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

يبدو رسم العلاقة بين الكيانات (ERD) للتعيين الواحد إلى الواحد بين الجداول مثل الصورة التالية. إعداد قاعدة البيانات لدينا جاهز ، لننتقل الآن إلى مشروع مثال Hibernate One to One.

هيكل مشروع مثال التعيين الواحد إلى الواحد في Hibernate

إنشاء مشروع Maven بسيط في بيئة تطوير الجافا الخاصة بك، أنا استخدم إكليبس. ستكون هيكلة المشروع النهائية كما في الصورة أدناه. أولاً، سننظر في مثال تعيين واحد إلى واحد في Hibernate بناءً على الـ XML، ثم سنقوم بتنفيذ نفس الأمر باستخدام التعليقات.

تبعيات Maven لـ Hibernate

ستبدو ملف pom.xml النهائي لدينا كما يلي.

<project xmlns="https://maven.apache.org/POM/4.0.0" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.journaldev.hibernate</groupId>
  <artifactId>HibernateOneToOneMapping</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <dependencies>
  	<dependency>
  		<groupId>org.hibernate</groupId>
  		<artifactId>hibernate-core</artifactId>
  		<version>4.3.5.Final</version>
  	</dependency>
  	<dependency>
  		<groupId>mysql</groupId>
  		<artifactId>mysql-connector-java</artifactId>
  		<version>5.0.5</version>
  	</dependency>
  </dependencies>
</project>

التبعيات هي فقط لـ Hibernate ومشغل جافا لـ MySQL. يرجى ملاحظة أنني أستخدم أحدث إصدار لـ Hibernate 4.3.5.Final ومشغل جافا لـ MySQL استنادًا إلى إصدار خادم قاعدة البيانات MySQL الخاص بي (5.0.5). Hibernate 4 يستخدم تسجيل JBoss ويتم استيراده تلقائيًا كتبعية. يمكنك التحقق من ذلك في تبعيات مافن للمشروع. إذا كنت تستخدم إصدارات أقدم من Hibernate ، قد تضطر إلى إضافة تبعيات slf4j.

نماذج تعيين واحد إلى واحد في Hibernate

ستكون نماذج التعيين واحد إلى واحد في Hibernate لتعكس جداول قاعدة البيانات كما يلي.

package com.journaldev.hibernate.model;

import java.util.Date;

public class Txn {

	private long id;
	private Date date;
	private double total;
	private Customer customer;
	
	@Override
	public String toString(){
		return id+", "+total+", "+customer.getName()+", "+customer.getEmail()+", "+customer.getAddress();
	}
	public long getId() {
		return id;
	}
	public void setId(long id) {
		this.id = id;
	}
	public Date getDate() {
		return date;
	}
	public void setDate(Date date) {
		this.date = date;
	}
	public double getTotal() {
		return total;
	}
	public void setTotal(double total) {
		this.total = total;
	}
	public Customer getCustomer() {
		return customer;
	}
	public void setCustomer(Customer customer) {
		this.customer = customer;
	}
	
}
package com.journaldev.hibernate.model;

public class Customer {

	private long id;
	private String name;
	private String email;
	private String address;
	
	private Txn txn;
	
	public long getId() {
		return id;
	}
	public void setId(long id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	public Txn getTxn() {
		return txn;
	}
	public void setTxn(Txn txn) {
		this.txn = txn;
	}
	
}

نظرًا لأننا نستخدم تكوينًا قائمًا على XML للتعيين ، فإن فئات النموذج أعلاه هي فئات POJO بسيطة أو فئات بنية جافا مع أساليب الحصول والتعيين. أستخدم اسم الفئة باسم “Txn” لتجنب الارتباك لأن واجهة برمجة تطبيقات Hibernate لديها اسم الفئة باسم “Transaction”.

تكوين تعيين Hibernate One to One

دعنا نقوم بإنشاء ملفات تكوين تعيين Hibernate One to One لجداول Txn و Customer. txn.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"https://hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<class name="com.journaldev.hibernate.model.Txn" table="TRANSACTION" >
		<id name="id" type="long">
			<column name="txn_id" />
			<generator class="identity" />
		</id>
		<property name="date" type="date">
			<column name="txn_date" />
		</property>
		<property name="total" type="double">
			<column name="txn_total" />
		</property>
		<one-to-one name="customer" class="com.journaldev.hibernate.model.Customer"
			cascade="save-update" />
	</class>
	
</hibernate-mapping>

نقطة مهمة للملاحظة أعلاه هي عنصر Hibernate one-to-one لخاصية العميل. customer.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
"https://hibernate.org/dtd/hibernate-mapping-3.0.dtd" >
<hibernate-mapping>

	<class name="com.journaldev.hibernate.model.Customer" table="CUSTOMER">
		<id name="id" type="long">
			<column name="txn_id" />
			<generator class="foreign">
				<param name="property">txn</param>
			</generator>
		</id>
		<one-to-one name="txn" class="com.journaldev.hibernate.model.Txn"
			constrained="true"></one-to-one>

		<property name="name" type="string">
			<column name="cust_name"></column>
		</property>
		<property name="email" type="string">
			<column name="cust_email"></column>
		</property>
		<property name="address" type="string">
			<column name="cust_address"></column>
		</property>
	</class>

</hibernate-mapping>

generator class=”foreign” هو الجزء المهم الذي يستخدم لتنفيذ مفتاح خارجي لهايبرنيت.

ملف تكوين Hibernate

فيما يلي ملف تكوين Hibernate لتكوين تعيين Hibernate قائم على XML. hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
		"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
		"https://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.password">pankaj123</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost/TestDB</property>
        <property name="hibernate.connection.username">pankaj</property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        
        <property name="hibernate.current_session_context_class">thread</property>
        <property name="hibernate.show_sql">true</property>
        
        <mapping resource="txn.hbm.xml"/>
        <mapping resource="customer.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

ملف تكوين Hibernate بسيط ، يحتوي على خصائص اتصال قاعدة البيانات وموارد تعيين Hibernate.

أداة مصنع Hibernate SessionFactory

هذه هي الفئة الخدمية لإنشاء مثيل SessionFactory في Hibernate.

package com.journaldev.hibernate.util;

import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;

public class HibernateUtil {

	private static SessionFactory sessionFactory;
	
	private static SessionFactory buildSessionFactory() {
        try {
            // إنشاء SessionFactory من hibernate.cfg.xml
        	Configuration configuration = new Configuration();
        	configuration.configure("hibernate.cfg.xml");
        	System.out.println("Hibernate Configuration loaded");
        	
        	ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
        	System.out.println("Hibernate serviceRegistry created");
        	
        	SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
        	
            return sessionFactory;
        }
        catch (Throwable ex) {
            System.err.println("Initial SessionFactory creation failed." + ex);
            ex.printStackTrace();
            throw new ExceptionInInitializerError(ex);
        }
    }
	
	public static SessionFactory getSessionFactory() {
		if(sessionFactory == null) sessionFactory = buildSessionFactory();
        return sessionFactory;
    }
}

هذا كل شيء، دعونا نكتب برنامج اختبار لاختبار تكوين تعيين الوظيفة واحد إلى واحد في hibernate بناء على الـ XML.

برنامج اختبار تكوين تعيين الوظيفة واحد إلى واحد في Hibernate بناء على الـ XML

في مثال برنامج اختبار تعيين الوظيفة واحد إلى واحد في hibernate، سنقوم أولاً بإنشاء كائن Txn وحفظه. بمجرد حفظه في قاعدة البيانات، سنستخدم الهوية المولدة لاسترداد كائن Txn وطباعته.

package com.journaldev.hibernate.main;

import java.util.Date;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;

import com.journaldev.hibernate.model.Customer;
import com.journaldev.hibernate.model.Txn;
import com.journaldev.hibernate.util.HibernateUtil;

public class HibernateOneToOneMain {

	public static void main(String[] args) {
		
		Txn txn = buildDemoTransaction();
		
		SessionFactory sessionFactory = null;
		Session session = null;
		Transaction tx = null;
		try{
		// الحصول على الجلسة
		sessionFactory = HibernateUtil.getSessionFactory();
		session = sessionFactory.getCurrentSession();
		System.out.println("Session created");
		// بدء العملية
		tx = session.beginTransaction();
		// حفظ كائن النموذج
		session.save(txn);
		// تأكيد العملية
		tx.commit();
		System.out.println("Transaction ID="+txn.getId());
		
		// الحصول على بيانات العملية المحفوظة
		printTransactionData(txn.getId(), sessionFactory);
		
		}catch(Exception e){
			System.out.println("Exception occured. "+e.getMessage());
			e.printStackTrace();
		}finally{
			if(!sessionFactory.isClosed()){
				System.out.println("Closing SessionFactory");
				sessionFactory.close();
			}
		}
	}

	private static void printTransactionData(long id, SessionFactory sessionFactory) {
		Session session = null;
		Transaction tx = null;
		try{
			// الحصول على الجلسة
			sessionFactory = HibernateUtil.getSessionFactory();
			session = sessionFactory.getCurrentSession();
			// بدء العملية
			tx = session.beginTransaction();
			// حفظ كائن النموذج
			Txn txn = (Txn) session.get(Txn.class, id);
			// تأكيد العملية
			tx.commit();
			System.out.println("Transaction Details=\n"+txn);
			
			}catch(Exception e){
				System.out.println("Exception occured. "+e.getMessage());
				e.printStackTrace();
			}
	}

	private static Txn buildDemoTransaction() {
		Txn txn = new Txn();
		txn.setDate(new Date());
		txn.setTotal(100);
		
		Customer cust = new Customer();
		cust.setAddress("Bangalore, India");
		cust.setEmail("[email protected]");
		cust.setName("Pankaj Kumar");
		
		txn.setCustomer(cust);
		
		cust.setTxn(txn);
		return txn;
	}

}

الآن عند تشغيل برنامج اختبار تعيين الوظيفة واحد إلى واحد في hibernate أعلاه، نحصل على الناتج التالي.

Hibernate Configuration loaded
Hibernate serviceRegistry created
Session created
Hibernate: insert into TRANSACTION (txn_date, txn_total) values (?, ?)
Hibernate: insert into CUSTOMER (cust_name, cust_email, cust_address, txn_id) values (?, ?, ?, ?)
Transaction ID=19
Hibernate: select txn0_.txn_id as txn_id1_1_0_, txn0_.txn_date as txn_date2_1_0_, txn0_.txn_total as txn_tota3_1_0_, 
customer1_.txn_id as txn_id1_0_1_, customer1_.cust_name as cust_nam2_0_1_, customer1_.cust_email as cust_ema3_0_1_, 
customer1_.cust_address as cust_add4_0_1_ from TRANSACTION txn0_ left outer join CUSTOMER customer1_ on 
txn0_.txn_id=customer1_.txn_id where txn0_.txn_id=?
Transaction Details=
19, 100.0, Pankaj Kumar, [email protected], Bangalore, India
Closing SessionFactory

كما ترون أنه يعمل بشكل جيد ونحن قادرون على استرداد البيانات من كلتا الجداول باستخدام معرّف المعاملة. تحقق من SQL المستخدمة بواسطة Hibernate داخليًا للحصول على البيانات، حيث يستخدم الانضمامات للحصول على البيانات من كلتا الجداول.

تعيين واحد إلى واحد في Hibernate باستخدام التعليق

في الجزء السابق، رأينا كيفية استخدام تكوين قائم على XML لتعيين واحد إلى واحد في Hibernate، الآن دعونا نرى كيف يمكننا استخدام JPA وتعليق Hibernate لتحقيق نفس الشيء.

ملف تكوين Hibernate التعليق

hibernate-annotation.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
		"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
		"https://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.password">pankaj123</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost/TestDB</property>
        <property name="hibernate.connection.username">pankaj</property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        
        <property name="hibernate.current_session_context_class">thread</property>
        <property name="hibernate.show_sql">true</property>
        
        <mapping class="com.journaldev.hibernate.model.Txn1"/>
        <mapping class="com.journaldev.hibernate.model.Customer1"/>
    </session-factory>
</hibernate-configuration>

تكوين Hibernate بسيط، كما ترون أن لدي اثنين من فئات النموذج التي سنستخدمها مع التعليقات – Txn1 و Customer1.

مثال على فئات النموذج في تعيين واحد إلى واحد في Hibernate باستخدام التعليق

لتكوين التعليق الخاص بتعيين واحد إلى واحد في هايبرنيت، تعتبر فئات النموذج الجزء الأكثر أهمية. دعونا نرى كيف تبدو فئات النموذج لدينا.

package com.journaldev.hibernate.model;

import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToOne;
import javax.persistence.Table;

import org.hibernate.annotations.Cascade;

@Entity
@Table(name="TRANSACTION")
public class Txn1 {

	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	@Column(name="txn_id")
	private long id;
	
	@Column(name="txn_date")
	private Date date;
	
	@Column(name="txn_total")
	private double total;
	
	@OneToOne(mappedBy="txn")
	@Cascade(value=org.hibernate.annotations.CascadeType.SAVE_UPDATE)
	private Customer1 customer;
	
	@Override
	public String toString(){
		return id+", "+total+", "+customer.getName()+", "+customer.getEmail()+", "+customer.getAddress();
	}

         // تم حذف طرق الحصول والتعيين للوضوح 
}

لاحظ أن معظم التعليقات هي من Java Persistence API لأن هايبرنيت يقدم تنفيذها. ومع ذلك، بالنسبة للتتابع، سنحتاج إلى استخدام تعليق هايبرنيت org.hibernate.annotations.Cascade وفئة التحديد org.hibernate.annotations.CascadeType.

package com.journaldev.hibernate.model;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToOne;
import javax.persistence.PrimaryKeyJoinColumn;
import javax.persistence.Table;

import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.Parameter;

@Entity
@Table(name="CUSTOMER")
public class Customer1 {

	@Id
	@Column(name="txn_id", unique=true, nullable=false)
	@GeneratedValue(generator="gen")
	@GenericGenerator(name="gen", strategy="foreign", parameters={@Parameter(name="property", value="txn")})
	private long id;
	
	@Column(name="cust_name")
	private String name;
	
	@Column(name="cust_email")
	private String email;
	
	@Column(name="cust_address")
	private String address;
	
	@OneToOne
	@PrimaryKeyJoinColumn
	private Txn1 txn;

         // طرق الحصول والتعيين
}

لاحظ أنه سيتعين علينا استخدام @GenericGenerator بحيث يتم استخدام معرف الهوية من التحويل بدلاً من توليده.

فئة المرافق لـ Hibernate SessionFactory

إن إنشاء SessionFactory مستقل عن الطريقة التي نقدم فيها تعيين هايبرنيت. تبدو فئة المرافق الخاصة بنا لإنشاء SessionFactory كما يلي.

package com.journaldev.hibernate.util;

import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;

public class HibernateAnnotationUtil {

	private static SessionFactory sessionFactory;
	
	private static SessionFactory buildSessionFactory() {
        try {
             // قم بإنشاء SessionFactory من hibernate-annotation.cfg.xml
        	Configuration configuration = new Configuration();
        	configuration.configure("hibernate-annotation.cfg.xml");
        	System.out.println("Hibernate Annotation Configuration loaded");
        	
        	ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
        	System.out.println("Hibernate Annotation serviceRegistry created");
        	
        	SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
        	
            return sessionFactory;
        }
        catch (Throwable ex) {
            System.err.println("Initial SessionFactory creation failed." + ex);
            ex.printStackTrace();
            throw new ExceptionInInitializerError(ex);
        }
    }
	
	public static SessionFactory getSessionFactory() {
		if(sessionFactory == null) sessionFactory = buildSessionFactory();
        return sessionFactory;
    }
}

مثال على برنامج اختبار تعيين واحد إلى واحد باستخدام التعليق

إليك برنامج اختبار بسيط لمثالنا على تعيين واحد إلى واحد باستخدام التعليق.

package com.journaldev.hibernate.main;

import java.util.Date;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;

import com.journaldev.hibernate.model.Customer1;
import com.journaldev.hibernate.model.Txn1;
import com.journaldev.hibernate.util.HibernateAnnotationUtil;

public class HibernateOneToOneAnnotationMain {

	public static void main(String[] args) {
		
		Txn1 txn = buildDemoTransaction();
		
		SessionFactory sessionFactory = null;
		Session session = null;
		Transaction tx = null;
		try{
		//الحصول على الجلسة
		sessionFactory = HibernateAnnotationUtil.getSessionFactory();
		session = sessionFactory.getCurrentSession();
		System.out.println("Session created using annotations configuration");
		//بدء العملية
		tx = session.beginTransaction();
		//حفظ كائن النموذج
		session.save(txn);
		//تأكيد العملية
		tx.commit();
		System.out.println("Annotation Example. Transaction ID="+txn.getId());
		
		//الحصول على بيانات العملية المحفوظة
		printTransactionData(txn.getId(), sessionFactory);
		}catch(Exception e){
			System.out.println("Exception occured. "+e.getMessage());
			e.printStackTrace();
		}finally{
			if(sessionFactory != null && !sessionFactory.isClosed()){
				System.out.println("Closing SessionFactory");
				sessionFactory.close();
			}
		}
	}

	private static void printTransactionData(long id, SessionFactory sessionFactory) {
		Session session = null;
		Transaction tx = null;
		try{
			//الحصول على الجلسة
			sessionFactory = HibernateAnnotationUtil.getSessionFactory();
			session = sessionFactory.getCurrentSession();
			//بدء العملية
			tx = session.beginTransaction();
			//حفظ كائن النموذج
			Txn1 txn = (Txn1) session.get(Txn1.class, id);
			//تأكيد العملية
			tx.commit();
			System.out.println("Annotation Example. Transaction Details=\n"+txn);
			
			}catch(Exception e){
				System.out.println("Exception occured. "+e.getMessage());
				e.printStackTrace();
			}
	}

	private static Txn1 buildDemoTransaction() {
		Txn1 txn = new Txn1();
		txn.setDate(new Date());
		txn.setTotal(100);
		
		Customer1 cust = new Customer1();
		cust.setAddress("San Jose, USA");
		cust.setEmail("[email protected]");
		cust.setName("Pankaj Kr");
		
		txn.setCustomer(cust);
		
		cust.setTxn(txn);
		return txn;
	}

}

هذا مقتطف من الناتج عند تنفيذ البرنامج أعلاه.

Hibernate Annotation Configuration loaded
Hibernate Annotation serviceRegistry created
Session created using annotations configuration
Hibernate: insert into TRANSACTION (txn_date, txn_total) values (?, ?)
Hibernate: insert into CUSTOMER (cust_address, cust_email, cust_name, txn_id) values (?, ?, ?, ?)
Annotation Example. Transaction ID=20
Hibernate: select txn1x0_.txn_id as txn_id1_1_0_, txn1x0_.txn_date as txn_date2_1_0_, txn1x0_.txn_total as txn_tota3_1_0_, 
customer1x1_.txn_id as txn_id1_0_1_, customer1x1_.cust_address as cust_add2_0_1_, customer1x1_.cust_email as cust_ema3_0_1_, 
customer1x1_.cust_name as cust_nam4_0_1_ from TRANSACTION txn1x0_ left outer join CUSTOMER customer1x1_ on 
txn1x0_.txn_id=customer1x1_.txn_id where txn1x0_.txn_id=?
Annotation Example. Transaction Details=
20, 100.0, Pankaj Kr, [email protected], San Jose, USA
Closing SessionFactory

لاحظ أن الناتج مشابه لتكوين XML الخاص بـ Hibernate One to One. هذا كل شيء بالنسبة لمثال تعيين Hibernate One to One، يمكنك تنزيل المشروع النهائي من الرابط أدناه والتلاعب به للتعلم أكثر.

تنزيل مشروع تعيين Hibernate OneToOne

Source:
https://www.digitalocean.com/community/tutorials/hibernate-one-to-one-mapping-example-annotation