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

JPA中配置ManyToOne和OneToMany的双向

    博客分类:
  • JPA
阅读更多

关键要记住下面一句话:

多的一方为关系维护端,关系维护端负责外键记录的更新,关系被维护端是没有权利更新外键记录。


注意:(亲身经历哦~~)
我晕,找了好久的错误,发现是自己图方便没有用@Table标注,结果生成表的表名为对应的类名,刚好
是MySQL的关键字group,以后还是最好加上@Table标注,并且表名最好以“t_”开头。

 

关系维护端(多的一方)

package contactbook.domain;

import java.io.Serializable;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

@Entity
@Table(name="t_contacts")
public class Contact implements Serializable{

	private static final long serialVersionUID = 5630087178466798365L;
	private Integer id;
	private String name;
	private String phone;
	private String email;
	private String address;
	private Group group;
	
	public Contact() {
		super();
	}
	public Contact(String name, String phone, String email, String address) {
		super();
		this.name = name;
		this.phone = phone;
		this.email = email;
		this.address = address;
	}
	@Id
	@GeneratedValue
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPhone() {
		return phone;
	}
	public void setPhone(String phone) {
		this.phone = phone;
	}
	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;
	}
	@ManyToOne(cascade={CascadeType.MERGE,CascadeType.REFRESH},optional=false)
	@JoinColumn(name="groupid")
	public Group getGroup() {
		return group;
	}
	public void setGroup(Group group) {
		this.group = group;
	}
	@Override
	public String toString() {
		return "name:"+name+",phone:"+phone+",email:"+email+",address:"+address;
	}
}
 

关系被维护端(一的一方)

package contactbook.domain;

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

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

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

	private static final long serialVersionUID = -6948198014545065959L;
	
	private Integer id;
	private String name;
	private Set<Contact> contacts = new HashSet<Contact>();
	
	public Group() {
		super();
	}
	public Group(String name) {
		super();
		this.name = name;
	}
	@Id
	@GeneratedValue
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	@OneToMany(mappedBy="group",cascade={CascadeType.PERSIST,CascadeType.MERGE,CascadeType.REFRESH},
	fetch=FetchType.EAGER)
	public Set<Contact> getContacts() {
		return contacts;
	}
	public void setContacts(Set<Contact> contacts) {
		this.contacts = contacts;
	}
	
	//添加方便
	public void addContacts(Contact contact){
		contact.setGroup(this);//通过多端来维护他们的关系,外键在多端
		this.contacts.add(contact);
	}
	@Override
	public String toString() {
		return "id:"+id+",name:"+name;
	}
	
}

  测试:

package contactbook.test;

import java.util.List;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import contactbook.domain.Contact;
import contactbook.domain.Group;
import contactbook.service.GroupService;

public class TestGroup {
	private ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
	private GroupService groupService = (GroupService) ac.getBean("groupService");
	
	@Test
	public void testSave(){
		Group g = new Group("同学");
		Contact c1 = new Contact("小红","13729767419","xiaohong@163.com","江西");
		Contact c2 = new Contact("刘俊","13753449488","lj1987@163.com","昆明");
		g.addContacts(c1);
		g.addContacts(c2);
		groupService.save(g);
	}
	
	@Test
	public void testFindAll(){
		List<Group> gList = groupService.findAll();
		System.out.println(gList);
		for(Group g:gList){
			System.out.println("id:"+g.getId()+","+g.getContacts());
		}
	}
}
  省略了applicationContext.xml代码,和src/META-INF/persistence.xml和dao和service代码。
分享到:
评论

相关推荐

    jpa-day3-onetomany.zip

    在这个名为"jpa-day3-onetomany.zip"的压缩包中,我们将探讨这种关系的配置、操作和实践。 一对多关系意味着一个实体(如“客户”)可以与多个其他实体(如“联系人”)相关联。在数据库设计中,这通常通过在“联系...

    JPA中的一对多双向关联与级联操作

    这种关联在数据库层面通常通过外键实现,而在JPA中,我们通过注解来配置这种关系。这篇博客将深入探讨JPA中的一对多双向关联以及级联操作。 首先,让我们理解一对多关联。假设我们有两个实体,一个是`User`(用户)...

    10_JPA详解_JPA中的一对多双向关联与级联操作.zip

    总结,本资料包主要探讨了JPA中一对多双向关联的配置以及级联操作的使用,这些都是在实际开发中处理复杂对象关系时不可或缺的知识点。通过理解和熟练应用这些概念,开发者可以更加高效地管理数据库中的对象关系。

    10_传智播客JPA详解_JPA中的一对多双向关联与级联操作

    1. JPA基本概念和配置:介绍JPA的核心概念,如实体、持久化上下文等,以及如何在项目中集成JPA。 2. `@OneToMany`和`@ManyToOne`注解:详细讲解这两个注解的使用方式,以及如何建立双向关联。 3. 级联操作详解:阐述...

    JPA_OneToMany学习教程

    "JPA_OneToMany"是JPA中的一个关键概念,涉及实体之间的关联关系,特别是在处理一对多关系时。本教程将深入探讨JPA中的OneToMany映射关系,以及如何在实际开发中有效地应用。 1. **OneToMany关系**:在关系数据库中...

    JPA学习总结(三)--JPAOneToMany双向关联

    在本篇《JPA学习总结(三)--...通过以上内容,我们了解了JPA中OneToMany双向关联的基本概念、配置以及注意事项。实际使用中,开发者需要结合业务场景,合理设计实体间的关联,以实现高效且稳定的数据库操作。

    JPA_2_一对多双向关联关系

    在这个场景中,我们将深入探讨如何在JPA 2中实现一对多双向关联关系。 首先,我们需要定义两个实体,一个是"一"的一端,另一个是"多"的一端。假设我们有`Department`(部门)和`Employee`(员工)两个实体。在`...

    JPA一对多双向配置实例

    本实例将深入探讨如何在JPA中配置一对多的双向关系,并通过实际代码示例来阐述其工作原理。 首先,让我们了解一对多关系的基本概念。在关系数据库中,如果一个表的记录可以与另一个表的多个记录相关联,那么我们就...

    JPA中文解释,JPA的API

    在JPA中,注解如`@Entity`用于标记实体类,`@Table`指定对应的数据库表,`@Id`定义主键,`@Column`定义字段属性,`@OneToMany`、`@ManyToOne`、`@OneToOne`和`@ManyToMany`处理关联关系等。针对Oracle,可能还会涉及...

    struts2+jpa+spring2.5配置基础框架

    4. **JPA的实体配置**:每个实体类需要标注`@Entity`,属性上使用`@Id`标识主键,还可以使用其他注解如`@ManyToOne`、`@OneToMany`等定义关联关系。 5. **错误和异常处理**:配置Struts2的全局结果,处理可能出现的...

    Spring Data JPA中文文档[1.4.3].zip

    8. **JPA实体**:学习如何定义实体类,使用`@Entity`, `@Table`, `@Id`, `@GeneratedValue`等注解,以及如何处理关系(如`@OneToOne`, `@OneToMany`, `@ManyToOne`, `@ManyToMany`)。 9. **转换和事件处理**:了解...

    SSH2框架整合并使用JPA注解配置

    - `@OneToMany`, `@ManyToOne`, `@OneToOne`, `@ManyToMany`:这些注解用于定义实体之间的关系,比如一对一、一对多、多对多。 3. **使用JPA进行数据操作**: - 通过`@Repository`注解创建DAO层接口,Spring会...

    JPA课程manyToMany OneToMany 等全部测试

    在本课程中,我们将深入探讨JPA中的一些关键关系映射类型,包括`@ManyToMany`、`@OneToMany`等,以及它们的实际应用和测试。 ### `@ManyToMany`关系 在数据库设计中,`ManyToMany`关系表示两个实体之间存在多对多...

    传智播客JPA学习笔记.pdf

    在JPA中,一对多关系通过@OneToMany和@ManyToOne注解定义,级联操作如CascadeType.PERSIST、CascadeType.REMOVE允许在操作父对象时自动处理子对象的状态。 **11. JPA中的一对多延迟加载与关系维护(一对多关系:二...

    jpa--11.双向一多

    在Java Persistence API(JPA)中,数据建模是通过实体类和它们之间的关联来实现的。在实际的业务场景中,经常会出现两个实体之间存在一对多(One-to-Many)的关系,比如一个用户可以有多个订单,或者一个部门有多个...

    JPA一对多和多对一关系

    在JPA中,实体间的关系映射是核心概念之一,其中一对多(OneToMany)和多对一(ManyToOne)是两种常见的关系类型。 ### 一对多关系(OneToMany) 在数据库中,一对多关系意味着一个表中的记录可以与另一个表中的多...

    jpa最基本最全配置的jar包

    8. **多对一(One-to-Many)、一对多(Many-to-One)、一对一(One-to-One)和多对多(Many-to-Many)关系**: 这些是常见的关联关系,可以通过@OneToMany、@ManyToOne、@OneToOne和@ManyToMany注解进行配置。...

    实用JPA开发指南----jpa核心技术(关联关系等的配置高级配置)

    **JPA(Java Persistence API)**是Java平台上的一个标准,用于管理关系数据库中的数据,它简化了在Java...EJB3_JPA.doc和JPA_Basic.pdf可能包含了更详细的教程和实例,帮助读者进一步掌握JPA的核心技术和高级配置。

    学习hibernate必读,JPA2新特征和JPA2映射的神秘之旅。

    在IT行业中,Hibernate是一款广泛应用的关系对象映射框架,它极大地简化了Java开发人员与数据库...深入研究并实践这些知识,将有助于你更好地理解和应用Hibernate以及JPA2,从而在数据库驱动的Java应用开发中游刃有余。

Global site tag (gtag.js) - Google Analytics