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

Hibernate Annotation 基于连接表的单向一对多关联

 
阅读更多

 

趁着今晚把一对多一起搞了吧,呵呵。。

 

一对多的关联形式我就不说了,这个例子是基于连接表jointable的,不懂的参数可以看下 Hibernate Annotation Reference 。

 

sql脚本(附件)

-- MySQL dump 10.13  Distrib 5.1.55, for Win32 (ia32)
--
-- Host: localhost    Database: hibernate_demo
-- ------------------------------------------------------
-- Server version	5.1.55-community

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Table structure for table `address`
--

DROP TABLE IF EXISTS `address`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `address` (
  `addressId` int(11) NOT NULL AUTO_INCREMENT,
  `item` varchar(30) NOT NULL,
  PRIMARY KEY (`addressId`)
) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `address`
--

LOCK TABLES `address` WRITE;
/*!40000 ALTER TABLE `address` DISABLE KEYS */;
INSERT INTO `address` VALUES (1,'item1'),(2,'item2');
/*!40000 ALTER TABLE `address` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `jointable`
--

DROP TABLE IF EXISTS `jointable`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `jointable` (
  `pid` int(11) DEFAULT NULL,
  `aid` int(11) DEFAULT NULL,
  KEY `join_person_fk` (`pid`),
  KEY `join_address_fk` (`aid`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `jointable`
--

LOCK TABLES `jointable` WRITE;
/*!40000 ALTER TABLE `jointable` DISABLE KEYS */;
INSERT INTO `jointable` VALUES (1,1),(1,2);
/*!40000 ALTER TABLE `jointable` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `person`
--

DROP TABLE IF EXISTS `person`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `person` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(30) NOT NULL,
  `age` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `person`
--

LOCK TABLES `person` WRITE;
/*!40000 ALTER TABLE `person` DISABLE KEYS */;
INSERT INTO `person` VALUES (1,'zhaoyunpeng',10);
/*!40000 ALTER TABLE `person` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

-- Dump completed on 2012-08-17  0:17:14
 

 

 

//Address.java

 

package com.zyp.examples;

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

import org.hibernate.annotations.GenericGenerator;

/**
 * Address entity. @author MyEclipse Persistence Tools
 */
@Entity
@Table(name="address")
public class Address implements java.io.Serializable {

	private static final long serialVersionUID = 5136081851186696459L;

	// Fields
	@Id
	@GenericGenerator(name="incrementGenerator",strategy="increment")
	@GeneratedValue(generator="incrementGenerator", strategy=GenerationType.IDENTITY)
	@Column(name="addressId")
	private Integer addressId;
	
	@Column(name="item")
	private String item;

	// Constructors

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

	/** full constructor */
	public Address(String item) {
		this.item = item;
	}

	// Property accessors

	public Integer getAddressId() {
		return this.addressId;
	}

	public void setAddressId(Integer addressId) {
		this.addressId = addressId;
	}

	public String getItem() {
		return this.item;
	}

	public void setItem(String item) {
		this.item = item;
	}

}
 

 

//Person.java

 

package com.zyp.examples;

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

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;
import org.hibernate.annotations.GenericGenerator;

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

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

	// Fields
	private static final long serialVersionUID = -5910642968209679728L;

	@Id
	@GenericGenerator(name="incrementGenerator",strategy="increment")
	@GeneratedValue(generator="incrementGenerator", strategy=GenerationType.IDENTITY)
	@Column(name="id")
	private Integer id;
	
	@Column(name="name", nullable=false)
	private String name;
	
	@Column(name="age", nullable=false)
	private Integer age;
	
	@OneToMany(targetEntity=Address.class, fetch=FetchType.EAGER, cascade=CascadeType.ALL)
	@Fetch(FetchMode.SELECT)
	@JoinTable(joinColumns=@JoinColumn(name="pid", nullable=true), 
			name="jointable", inverseJoinColumns=@JoinColumn(name="aid"))
	private Set<Address> address = new HashSet<Address>();

	// Constructors

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


	// 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 Integer getAge() {
		return this.age;
	}

	public void setAge(Integer age) {
		this.age = age;
	}


	public Set<Address> getAddress() {
		return address;
	}


	public void setAddress(Set<Address> address) {
		this.address = address;
	}

	
}
 

 

//HibernateTest.java

 

package com.zyp.examples;

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

import org.hibernate.Session;

public class HibernateTest {

	public static void main(String[] args) {
		
		//级联添加
//		addByPerson();
		
		//级联删除
		deleteByPerson();
	}
	
	public static void deleteByPerson()
	{
		Session session = HibernateUtil.getSessionFactory().openSession();
		session.beginTransaction();
		session.delete(session.load(Person.class, new Integer(1)));
		session.getTransaction().commit();
	}
	
	public static void addByPerson()
	{
		Address a1 = new Address();
		a1.setItem("item1");
		Address a2 = new Address();
		a2.setItem("item2");
		
		Set<Address> address = new HashSet<Address>();
		address.add(a1);
		address.add(a2);
		
		Person p = new Person();
		p.setAge(10);
		p.setName("zhaoyunpeng");
		p.setAddress(address);
		
		Session session = HibernateUtil.getSessionFactory().openSession();
		session.beginTransaction();
		session.save(p);
		session.getTransaction().commit();
		
	}
	
}
 


基于连接表的关联查询,最主要的就是 @jointable 注解的参数配置,看名字就知道。

既然是基于jointable的,那么name肯定是连接表的名字,joincolumn肯定是一端的关联列,inverseJoinColumns肯定是多端在连接表中的关联列,就这么简单...

 

 

2012年8月17日0:25:36

 

 

分享到:
评论

相关推荐

    Hibernate_Annotation关联映射

    通过关联表来保存两个实体之间的连接关系(要模拟一对一关联必须在每一个外键上添加唯一约束)。 1.共享主键的一对一关联映射: @Entity @Table(name="Test_Body") public class Body { private Integer id; ...

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

    在单向一对一关联中,只有一个实体知道另一个实体的存在,而另一个实体并不知情。这里我们讨论的是单向外键关联,即一方实体持有了另一方的外键。 在Hibernate中,一对一关联可以通过`@OneToOne`注解来实现。这个...

    Hibernate+中文文档

    7.3. 使用连接表的单向关联(Unidirectional associations with join tables) 7.3.1. 一对多(one to many) 7.3.2. 多对一(many to one) 7.3.3. 一对一(one to one) 7.3.4. 多对多(many to many) 7.4. ...

    韩顺平老师Hibernate教程PPT(完整)

    Hibernate支持一对一、一对多、多对一和多对多四种关联关系的映射,包括单向和双向关联,以及懒加载和立即加载策略。 十、性能优化 为了提高性能,可以采用批处理、延迟加载、缓存策略等手段。比如,使用BatchSize...

    HibernateAPI中文版.chm

    7.3. 使用连接表的单向关联(Unidirectional associations with join tables) 7.3.1. 一对多(one to many) 7.3.2. 多对一(many to one) 7.3.3. 一对一(one to one) 7.3.4. 多对多(many to many) 7.4. ...

    hibernate3.2中文文档(chm格式)

    7.3. 使用连接表的单向关联(Unidirectional associations with join tables) 7.3.1. 一对多(one to many) 7.3.2. 多对一(many to one) 7.3.3. 一对一(one to one) 7.3.4. 多对多(many to many) 7.4. ...

    Hibernate中文详细学习文档

    7.3. 使用连接表的单向关联(Unidirectional associations with join tables) 7.3.1. 一对多(one to many) 7.3.2. 多对一(many to one) 7.3.3. 一对一(one to one) 7.3.4. 多对多(many to many) 7.4. ...

    Hibernate教程

    8.3. 使用连接表的单向关联(Unidirectional associations with join tables) 8.3.1. 一对多(one to many) 8.3.2. 多对一(many to one) 8.3.3. 一对一(one to one) 8.3.4. 多对多(many to many) 8.4. ...

    Hibernate 中文 html 帮助文档

    7.3. 使用连接表的单向关联(Unidirectional associations with join tables) 7.3.1. 一对多(one to many) 7.3.2. 多对一(many to one) 7.3.3. 一对一(one to one) 7.3.4. 多对多(many to many) 7.4. 双向...

    最全Hibernate 参考文档

    7.3. 使用连接表的单向关联(Unidirectional associations with join tables) 7.3.1. 一对多(one to many) 7.3.2. 多对一(many to one) 7.3.3. 一对一(one to one) 7.3.4. 多对多(many to many) 7.4. 双向...

    Hibernate3的帮助文档

    8.3. 使用连接表的单向关联(Unidirectional associations with join tables) 8.3.1. 一对多(one to many) 8.3.2. 多对一(many to one) 8.3.3. 一对一(one to one) 8.3.4. 多对多(many to many) 8.4. ...

    单向1—Habernate 实例

    7. **注解映射(Annotation Mapping)**:使用Java注解替代XML映射,更简洁直观,例如`@ManyToOne`表示多对一的关联。 8. **SessionFactory**:Hibernate的核心工厂类,用于创建Session对象。 9. **Session**:是...

    hibernate 体系结构与配置 参考文档(html)

    使用连接表的单向关联(Unidirectional associations with join tables) 7.3.1. 一对多(one to many) 7.3.2. 多对一(many to one) 7.3.3. 一对一(one to one) 7.3.4. 多对多(many to many) 7.4. 双向...

    Hibernate_3.2.0_符合Java习惯的关系数据库持久化

    7.3. 使用连接表的单向关联(Unidirectional associations with join tables) 7.3.1. 一对多(one to many) 7.3.2. 多对一(many to one) 7.3.3. 一对一(one to one) 7.3.4. 多对多(many to many) 7.4. ...

    《精通Hibernate》电子版(孙卫琴)

    同时,书中涵盖了单向和双向一对多、一对一、多对多等各种关系映射的实现方法。 四、Hibernate查询语言(HQL) HQL是Hibernate提供的面向对象的查询语言,类似于SQL,但更专注于对象。书中讲解了HQL的基本语法,包括...

    hibernate3.04中文文档.chm

    8.3. 使用连接表的单向关联(Unidirectional associations with join tables) 8.3.1. 一对多(one to many) 8.3.2. 多对一(many to one) 8.3.3. 一对一(one to one) 8.3.4. 多对多(many to many) 8.4. ...

    hibernate 框架详解

    使用连接表的单向关联(Unidirectional associations with join tables) 8.3.1. 一对多(one to many) 8.3.2. 多对一(many to one) 8.3.3. 一对一(one to one) 8.3.4. 多对多(many to many) 8.4. 双向...

    Hibernate_学习笔记.

    - **一对一关联映射** - **唯一外键关联-单向**:一个对象有一个唯一的外键指向另一个对象。 - **唯一外键关联-双向**:两个对象互相引用对方。 - **主键关联-单向**:一个对象的主键作为另一个对象的外键。 - *...

    Hibernate3+中文参考文档

    7.3. 使用连接表的单向关联(Unidirectional associations with join tables) 7.3.1. 一对多(one to many) 7.3.2. 多对一(many to one) 7.3.3. 一对一(one to one) 7.3.4. 多对多(many to many) 7.4. 双向...

Global site tag (gtag.js) - Google Analytics