`
默翁1
  • 浏览: 27128 次
社区版块
存档分类
最新评论

一对一主键映射关系

阅读更多

这个例子中以:公民与身份证号是一对一的关系

public class TabPeople {
	
	private int id;
	private String name;
	private int sex;
	private int age;
	private IDCard idCard;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getSex() {
		return sex;
	}
	public void setSex(int sex) {
		this.sex = sex;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public IDCard getIdCard() {
		return idCard;
	}
	public void setIdCard(IDCard idCard) {
		this.idCard = idCard;
	}
}	

 

<hibernate-mapping>
	<!-- 每一个class类对应一个持久化对象 -->
	<class name="model.TabPeople" table="mw_peo">
		<id name="id" column="id" type="int">
		<!-- 主键的生成策略 -->
			<generator class="native"/>
		</id>
		<property name="name"></property>
		<property name="age"></property>
		<property name="sex"></property>
		<one-to-one name="idCard" class="model.IDCard" cascade="all"></one-to-one>
	</class>
</hibernate-mapping>

 

public class IDCard {
	
	private int id;
	private int cardCode;
	private TabPeople people;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public int getCardCode() {
		return cardCode;
	}
	public void setCardCode(int cardCode) {
		this.cardCode = cardCode;
	}
	public TabPeople getPeople() {
		return people;
	}
	public void setPeople(TabPeople people) {
		this.people = people;
	}
	
	
}

 

<hibernate-mapping>
	<!-- 每一个class类对应一个持久化对象 -->
	<class name="model.IDCard" table="mw_card">
		<id name="id" column="id" type="int">
		<!-- 主键的生成策略 -->
			<generator class="foreign">
				<param name="property">people</param>
			</generator>
		</id>
		<property name="cardCode"></property>
		<one-to-one name="people" class="model.TabPeople" constrained="true"/>
	</class>
</hibernate-mapping>

 

	public static void main(String[] args) {
		Configuration configuration=new Configuration().configure();
		SessionFactory sessionFactory=configuration.buildSessionFactory();
		Session session=sessionFactory.openSession();
		Transaction transaction=session.beginTransaction();
		TabPeople people = new TabPeople();
		people.setAge(18);
		people.setName("zhansan");
		people.setSex(1);
		IDCard card=new IDCard();
		card.setCardCode(7238498);
		people.setIdCard(card);
		card.setPeople(people);
		session.save(people);
		
		transaction.commit();
		session.close();
	}

 注意测试类中一定要写card.setPeople(people),因为IDCard中的主键是根据people中的主键来获取,如果去掉这句代码,会出现以下错误:

Exception in thread "main" org.hibernate.id.IdentifierGenerationException: attempted to assign id from null one-to-one property [model.IDCard.people]
	at org.hibernate.id.ForeignGenerator.generate(ForeignGenerator.java:101)
	at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:120)
	at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:204)
	at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:189)
	at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:114)
	at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90)
	at org.hibernate.internal.SessionImpl.fireSaveOrUpdate(SessionImpl.java:615)
	at org.hibernate.internal.SessionImpl.saveOrUpdate(SessionImpl.java:608)
	at org.hibernate.engine.spi.CascadingAction$5.cascade(CascadingAction.java:258)
	at org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:380)
	at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:323)
	at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:208)
	at org.hibernate.engine.internal.Cascade.cascade(Cascade.java:165)
	at org.hibernate.event.internal.AbstractSaveEventListener.cascadeAfterSave(AbstractSaveEventListener.java:462)
	at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:337)
	at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:195)
	at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:128)
	at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:204)
	at org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:55)
	at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:189)
	at org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:49)
	at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90)
	at org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:642)
	at org.hibernate.internal.SessionImpl.save(SessionImpl.java:635)
	at org.hibernate.internal.SessionImpl.save(SessionImpl.java:631)
	at test.TestApplication8.main(TestApplication8.java:36)

 

分享到:
评论

相关推荐

    hibernate 双向一对一基于主键的关联映射

    在Java持久化框架Hibernate中,双向一对一(OneToOne)基于主键的关联映射是一种常见的对象关系映射(ORM)技术。这种映射方式允许两个实体类之间建立一对一的关联,且关联是通过主键来实现的。接下来,我们将深入...

    Hibernate一对一主键映射

    在这个实例中,我们将深入探讨Hibernate一对一主键映射的概念、配置以及如何通过源代码和测试程序进行实践。 1. **一对一关系理解**: 一对一关系指的是一个实体类中的记录对应另一个实体类中的唯一一条记录。例如...

    Hibernate一对一主键关联映射(双向关联)

    本篇文章将详细探讨双向一对一主键关联映射的概念、配置以及实际应用。 首先,我们需要了解一对一关联的类型。一对一关联分为两种:基于主键的关联(Primary Key Association)和基于外键的关联(Foreign Key ...

    hibernate一对一主键关联映射(单项关联)

    本篇将深入探讨在Hibernate中实现一对一主键关联映射的单项关联方式。这种关联意味着两个实体类共享相同的主键,即一个实体类的一个实例对应另一个实体类的唯一实例。 首先,我们要明确一对一主键关联映射的基本...

    hibernate一对一主键关联映射(双项关联)

    在Java的持久化框架...总结来说,Hibernate的一对一主键关联映射,尤其是双向关联,能有效地简化对象关系的映射,提高代码的可读性和维护性。然而,需要根据实际情况权衡其带来的性能影响,确保系统设计的高效性。

    Hibernate教程07_关系映射之一对一双向主键关联

    在本教程中,我们将深入探讨Hibernate中的一个关键概念——关系映射,特别是“一对一双向主键关联”。这种关联类型是数据库设计中的常见模式,它允许两个实体类之间通过共享相同的主键来建立关联。在Java应用中,...

    Hibernate教程06_关系映射之一对一单向主键关联

    **标题详解:** "Hibernate教程06_关系映射之一对一单向主键关联" 在Hibernate框架中,关系映射是将数据库中的表关系映射到对象模型上的过程。本教程聚焦于一对一(One-to-One)单向主键关联,这是一种特定类型的...

    Hibernate一对一主键关联映射(单向关联)

    本篇将重点讲解如何实现一对一主键关联映射的单向关联,并通过一个实际的例子来帮助理解。 在一对一主键关联映射中,两个实体共享同一个主键,这意味着它们在数据库中的记录具有相同的标识符。这种映射关系通常用于...

    hibernate使用主键关联的一对一关系

    总之,理解并正确实现Hibernate中的一对一主键关联对于优化数据模型和提高代码的可维护性至关重要。通过共享主键,我们可以确保数据的完整性和一致性,同时简化对象之间的交互。阅读提供的博客资源,结合本文的讲解...

    hibernate 主键一对一映射(单向) 实例(java类)

    通过以上步骤,我们就可以在Hibernate中实现单向一对一主键映射。这个实例中的`hibernate_fifth_one2one_pk_1`文件可能包含了相关的代码示例或测试用例,供你参考和学习。理解并掌握一对一映射是提高Hibernate使用...

    hibernate主键一对一关联映射代码示例

    在Java的持久化框架Hibernate中,一对一(OneToOne)关联映射是一种常见的关系映射方式,用于表示两个实体之间一对一的关联关系。本示例将深入讲解如何在Hibernate中实现主键一对一关联映射,并通过代码示例进行解析...

    Hibernate 一对一关联映射(主键关联VS唯一外键关联)

    在Java的持久化框架Hibernate中,一对一(One-to-One)关联映射是常见的关系数据库模型。本篇文章将深入探讨两种实现一对一关联的方式:主键关联(Primary Key Join)和唯一外键关联(ForeignKey Join),并结合源码...

    Hibernate Annotation 共享主键一对一双向关联

    在一对一的关联关系中,如果两个实体共享同一个主键,那么这种关联被称为共享主键的一对一关联。这意味着这两个实体的表在数据库中通过主键进行连接,一个实体的主键同时也作为另一个实体的外键。 在Hibernate中,...

    hibernate 无主键表映射

    在Java的持久化框架Hibernate中,无主键表映射是一种特殊情况,主要处理那些在数据库中没有明确单一主键的表。这种情况通常出现在那些通过多个字段共同唯一标识一条记录的复合主键(Composite Key)场景。本文将详细...

    hibernate主键实现一对一单向关联关系源码

    在Java的持久化框架Hibernate中,一对一(One-to-One)关联关系是常见的一种实体关系映射。本主题将深入探讨如何使用Hibernate通过主键来实现一对一的单向关联关系,并提供相关的源码分析。 首先,我们需要理解一对...

    hibernate 映射关系学习入门 一对一映射

    本文将深入探讨 Hibernate 中的一对一映射关系,并以"hibernate 映射关系学习入门 一对一映射Eclipse源码"为主题,详细解析其概念、配置以及实际应用。 一对一映射是Hibernate中的一种关联关系,它表示两个实体之间...

    Hibernate一对多使用非主键关联设置

    通过这种方式,我们就可以在Hibernate中设置一对多非主键关联,使得在操作部门和员工数据时,能够方便地维护它们之间的关系。这种方法允许我们在不违反数据库设计原则的情况下,灵活地处理实体之间的关联。同时,非...

    一对一映射一对一映射

    一对一映射是数据库设计中的一个重要概念,特别是在关系型数据库中,它用于描述两个表之间的一种特殊关系,即每个表中的记录最多只能与另一个表中的一条记录相关联。这种关系非常紧密,通常出现在一个实体的信息被...

Global site tag (gtag.js) - Google Analytics