`
paladin1988
  • 浏览: 329615 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

 
阅读更多


写了这么几篇都是单向的关联,干脆后面的都写双向关联吧,今晚天就把Hibernate Annotation的问题都结了。


使用@OneToOne 注解可以建立实体bean之间的一对一的关联. 一对一关联有三种情况: 一是关联的实体都共享同样的主键, 二是其中一个实体通过外键关联到另一个实体的主键 (注意要模拟一对一关联必须在外键列上添加唯一约束). 三是通过关联表来保存两个实体之间的连接关系 (注意要模拟一对一关联必须在每一个外键上添加唯一约束).(摘自Hibernate Annotation Reference)


本篇是基于共享主键的方式来写的,顾名思义,共享主键即两个表使用一个主键。



数据库脚本:(见附件)

 

//User.java

 

package com.zyp.examples;

import javax.persistence.CascadeType;
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.PrimaryKeyJoinColumn;
import javax.persistence.Table;

import org.hibernate.annotations.GenericGenerator;

/**
 * User entity. @author MyEclipse Persistence Tools
 */

@Entity
@Table(name="user")
public class User implements java.io.Serializable {

	// Fields
	private static final long serialVersionUID = 6210252824713630770L;
	
	@Id
	@Column(name="id")
	@GeneratedValue(generator="incrementGenerator", strategy=GenerationType.IDENTITY)
	@GenericGenerator(name="incrementGenerator", strategy="increment")
	private Integer id;
	
	@Column(name="name")
	private String name;
	
	@Column(name="password")
	private String password;
	
	@OneToOne(targetEntity=Profile.class, cascade={CascadeType.ALL})
	//这里用的是PrimaryKeyJoinColumn,不是JoinColumn
	@PrimaryKeyJoinColumn
	private Profile profile;

	// Constructors

	/** default constructor */
	public User() {
	}

	/** full constructor */
	public User(String name, String password) {
		this.name = name;
		this.password = password;
	}

	// Property accessors

	public Integer getId() {
		return this.id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getName() {
		return this.name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getPassword() {
		return this.password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public Profile getProfile() {
		return profile;
	}

	public void setProfile(Profile profile) {
		this.profile = profile;
	}

}
 

//Profile.java

 

package com.zyp.examples;

import javax.persistence.CascadeType;
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.PrimaryKeyJoinColumn;
import javax.persistence.Table;

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

/**
 * Profile entity. @author MyEclipse Persistence Tools
 */

@Entity
@Table(name="profile")
public class Profile implements java.io.Serializable {

	// Fields
	private static final long serialVersionUID = -6436265401783499807L;
	
	@Id
	@Column(name="pid")
	@GenericGenerator(name="foreignKey", strategy="foreign", parameters=@Parameter(name="property", value="user"))
	@GeneratedValue(generator="foreignKey", strategy=GenerationType.IDENTITY)
	private Integer pid;
	
	@Column(name="email")
	private String email;
	
	@Column(name="address")
	private String address;
	
	@OneToOne(targetEntity=User.class, cascade={CascadeType.ALL}, mappedBy="profile")
	@PrimaryKeyJoinColumn(name="id", referencedColumnName="id")
	private User user;

	// Constructors

	/** default constructor */
	public Profile() {
	}

	/** full constructor */
	public Profile(Integer pid, String email, String address) {
		this.pid = pid;
		this.email = email;
		this.address = address;
	}

	// Property accessors

	public Integer getPid() {
		return this.pid;
	}

	public void setPid(Integer pid) {
		this.pid = pid;
	}

	public String getEmail() {
		return this.email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public String getAddress() {
		return this.address;
	}

	public void setAddress(String address) {
		this.address = address;
	}

	public User getUser() {
		return user;
	}

	public void setUser(User user) {
		this.user = user;
	}

}
 

 

//HibernateTest.java

package com.zyp.examples;


import org.hibernate.Session;

public class HibernateTest {

	public static void main(String[] args) {
//		addProfileByUser();
//		addUserByProfile();
		deleteFromUser();
	}
	
	public static void deleteFromUser()
	{
		Session session = HibernateUtil.getSessionFactory().openSession();
		session.getTransaction().begin();
		session.delete(session.load(User.class, new Integer(1)));
		session.getTransaction().commit();
	}
	
	public static void addProfileByUser()
	{		
		Profile p = new Profile();
		p.setAddress("yunnan");
		p.setEmail("sdfds@1236.com");
		
		User user = new User();
		user.setName("zyp");
		user.setPassword("123");
		
		//注意这里是双向关系
		user.setProfile(p);
		p.setUser(user);
		
		Session session = HibernateUtil.getSessionFactory().openSession();
		session.getTransaction().begin();
		session.save(user);
		session.getTransaction().commit();
		
	}
	
	public static void addUserByProfile()
	{
		Profile p = new Profile();
		p.setAddress("yunnan");
		p.setEmail("sdfds@1236.com");
		
		User user = new User();
		user.setName("zyp");
		user.setPassword("123");
		
		//注意这里是双向关系
		user.setProfile(p);
		p.setUser(user);
		
		Session session = HibernateUtil.getSessionFactory().openSession();
		session.getTransaction().begin();
		//保存profile
		session.save(p);
		session.getTransaction().commit();
	}
}
 

 

 

写这个文章的时候遇到了不少的麻烦,也差了一些资料,下面把一些错误罗列出来,希望大家把参考的URL好好看一下消化下,老实说,Annotation里面的参数还是挺麻烦的,有的时候只能凭感觉和经验。

 

 


参考文章

JPA Annotation常用指南

http://blog.sina.com.cn/s/blog_3da1cce1010009dj.html


经典错误:attempted to assign id from null one-to-one

http://hi.baidu.com/88feiquan/item/856bf3dec2b23e15e0f46fe0


Hibernate Mapping One-to-One using Annotations Tutorial

http://www.dzone.com/tutorials/java/hibernate/hibernate-example/hibernate-mapping-one-to-one-using-annotations-1.html



http://stackoverflow.com/questions/787698/jpa-hibernate-one-to-one-relationship




 

 

 

 

分享到:
评论

相关推荐

    Hibernate Annotation 唯一外键一对一双向关联

    在Java的持久化框架Hibernate中,`@OneToOne`注解用于表示一对一的关联关系,而唯一外键一对一双向关联则是这种关系的一种具体实现方式。这篇文章将深入探讨这一概念,帮助你理解如何在实际开发中应用。 首先,我们...

    Hibernate Annotation 基于外键的一对多双向关联

    本文将深入探讨如何使用Hibernate注解实现基于外键的一对多双向关联。我们将通过具体实例来解析这个主题,并结合源码分析其工作原理。 首先,我们要明白一对多关联意味着一个实体可以拥有多个关联的实体。在数据库...

    Hibernate Annotation jar

    这里面包涵了需要用Hibernate Annotation时,所需要的所有jar包! 现在我们公司在做web项目的时候,已经不用*.hbm.xml这种映射文件了,都是用Annotation(注解)方式来完成实体与表之间的映射关系,这样看起来比用...

    hibernate annotation hibernate3

    Hibernate 3是Hibernate ORM框架的一个重要版本,它引入了许多新特性,如对JPA(Java Persistence API)的支持,以及对注解的广泛使用。这一版本的更新使得Hibernate更加易于使用,同时也提高了代码的可读性和可维护...

    hibernate annotation 中文文档

    - `@OneToOne`, `@OneToMany`, `@ManyToOne`, `@ManyToMany`: 用于处理各种关联关系,如一对一、一对多、多对一、多对多。 3. **继承与多态** - `@Inheritance`: 定义继承策略,如SINGLE_TABLE(单表)、JOINED...

    hibernate annotation中文文档

    hibernate annotation中文文档

    最全的Hibernate Annotation API文档

    在Hibernate中,注解(Annotation)是一种声明式的方法,用于配置实体类、属性以及它们与数据库表之间的映射关系。本文将深入探讨“最全的Hibernate Annotation API文档”中的关键知识点。 一、实体类(Entity) 在...

    Hibernate Annotation 中文文档

    在这个例子中,`User`类代表了`users`表,`id`是主键,`username`是表的一个列,`role`是与`Role`类的一对多关联。 **4. 注解的优势** - **简洁性**:注解使得ORM配置与实体类代码紧密集成,减少了XML配置文件的...

    Hibernate Annotation库

    Hibernate Annotation库是Java开发中用于简化对象关系映射(ORM)的一个重要组件,它使得开发者能够在Java类上直接使用注解来定义数据库映射,从而避免了传统的XML配置文件。这三个特定的jar包是Hibernate ORM框架中...

    Hibernate Annotation入门

    而Hibernate Annotation是Hibernate的一个重要特性,它通过在Java类和字段上添加注解来简化数据库表和实体类之间的映射配置。这篇博文将带你了解如何使用Hibernate Annotation进行开发。 首先,我们需要理解Java...

    Hibernate Annotation 学习笔记

    而Hibernate Annotation则是Hibernate提供的一种基于注解的实体映射方式,它极大地简化了传统XML配置文件的繁琐工作,使得开发过程更加简洁高效。本文将通过一个实际操作的实例,逐步介绍Hibernate Annotation的基础...

    Hibernate_Annotation关联映射

    在多对多关联中很多值是自动生成,党双向多对多关联中没有定义任何物理映射时,Hibernate根据以下规则生成相应的值,关联表名:主表表名+下划线+从表表名,关联到主表的外键名:主表名+下划线+主表中的主键列名,...

    Hibernate一对多(多对一)双向关联(annotation/xml)

    总之,理解和熟练运用Hibernate的一对多、多对一以及双向关联,是提升Java企业级应用开发效率的关键。通过注解或XML配置,开发者可以灵活地定义实体间的关联,实现数据的持久化。同时,注意级联操作、懒加载策略等...

    Hibernate一对一单向外键关联 (联合主键annotation)

    本篇将详细讲解如何使用Hibernate进行一对一单向外键关联,并且该关联涉及到联合主键的注解配置。 首先,一对一关联可以分为两种类型:单向和双向。在单向一对一关联中,只有一个实体知道另一个实体的存在,而另一...

    Hibernate Annotation

    Hibernate Annotation

    hibernate annotation api chm文件

    - `@OneToMany`, `@ManyToOne`, `@OneToOne`, `@ManyToMany`: 定义不同类型的关联关系,如一对一、一对多、多对一和多对多。 3. **实体类的注解示例** 一个简单的User实体类可能如下所示: ```java @Entity @...

    hibernate 注解 annotation 教程

    hibernate 注解 annotation 教程

    hibernate-主键生成方式[自动、手动]-annotation

    本文是讲解的是hibernate3.2的主键生成方式,通过annotation来实现,详细的分析了主键在hibernate的生成以及在真实项目的运用。。。。

Global site tag (gtag.js) - Google Analytics