关键要记住下面一句话:
多的一方为关系维护端,关系维护端负责外键记录的更新,关系被维护端是没有权利更新外键记录。
注意:(亲身经历哦~~)
我晕,找了好久的错误,发现是自己图方便没有用@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中,我们通过注解来配置这种关系。这篇博客将深入探讨JPA中的一对多双向关联以及级联操作。 首先,让我们理解一对多关联。假设我们有两个实体,一个是`User`(用户)...
总结,本资料包主要探讨了JPA中一对多双向关联的配置以及级联操作的使用,这些都是在实际开发中处理复杂对象关系时不可或缺的知识点。通过理解和熟练应用这些概念,开发者可以更加高效地管理数据库中的对象关系。
1. JPA基本概念和配置:介绍JPA的核心概念,如实体、持久化上下文等,以及如何在项目中集成JPA。 2. `@OneToMany`和`@ManyToOne`注解:详细讲解这两个注解的使用方式,以及如何建立双向关联。 3. 级联操作详解:阐述...
"JPA_OneToMany"是JPA中的一个关键概念,涉及实体之间的关联关系,特别是在处理一对多关系时。本教程将深入探讨JPA中的OneToMany映射关系,以及如何在实际开发中有效地应用。 1. **OneToMany关系**:在关系数据库中...
在本篇《JPA学习总结(三)--...通过以上内容,我们了解了JPA中OneToMany双向关联的基本概念、配置以及注意事项。实际使用中,开发者需要结合业务场景,合理设计实体间的关联,以实现高效且稳定的数据库操作。
在这个场景中,我们将深入探讨如何在JPA 2中实现一对多双向关联关系。 首先,我们需要定义两个实体,一个是"一"的一端,另一个是"多"的一端。假设我们有`Department`(部门)和`Employee`(员工)两个实体。在`...
本实例将深入探讨如何在JPA中配置一对多的双向关系,并通过实际代码示例来阐述其工作原理。 首先,让我们了解一对多关系的基本概念。在关系数据库中,如果一个表的记录可以与另一个表的多个记录相关联,那么我们就...
在JPA中,注解如`@Entity`用于标记实体类,`@Table`指定对应的数据库表,`@Id`定义主键,`@Column`定义字段属性,`@OneToMany`、`@ManyToOne`、`@OneToOne`和`@ManyToMany`处理关联关系等。针对Oracle,可能还会涉及...
4. **JPA的实体配置**:每个实体类需要标注`@Entity`,属性上使用`@Id`标识主键,还可以使用其他注解如`@ManyToOne`、`@OneToMany`等定义关联关系。 5. **错误和异常处理**:配置Struts2的全局结果,处理可能出现的...
8. **JPA实体**:学习如何定义实体类,使用`@Entity`, `@Table`, `@Id`, `@GeneratedValue`等注解,以及如何处理关系(如`@OneToOne`, `@OneToMany`, `@ManyToOne`, `@ManyToMany`)。 9. **转换和事件处理**:了解...
- `@OneToMany`, `@ManyToOne`, `@OneToOne`, `@ManyToMany`:这些注解用于定义实体之间的关系,比如一对一、一对多、多对多。 3. **使用JPA进行数据操作**: - 通过`@Repository`注解创建DAO层接口,Spring会...
在本课程中,我们将深入探讨JPA中的一些关键关系映射类型,包括`@ManyToMany`、`@OneToMany`等,以及它们的实际应用和测试。 ### `@ManyToMany`关系 在数据库设计中,`ManyToMany`关系表示两个实体之间存在多对多...
在JPA中,一对多关系通过@OneToMany和@ManyToOne注解定义,级联操作如CascadeType.PERSIST、CascadeType.REMOVE允许在操作父对象时自动处理子对象的状态。 **11. JPA中的一对多延迟加载与关系维护(一对多关系:二...
在Java Persistence API(JPA)中,数据建模是通过实体类和它们之间的关联来实现的。在实际的业务场景中,经常会出现两个实体之间存在一对多(One-to-Many)的关系,比如一个用户可以有多个订单,或者一个部门有多个...
在JPA中,实体间的关系映射是核心概念之一,其中一对多(OneToMany)和多对一(ManyToOne)是两种常见的关系类型。 ### 一对多关系(OneToMany) 在数据库中,一对多关系意味着一个表中的记录可以与另一个表中的多...
8. **多对一(One-to-Many)、一对多(Many-to-One)、一对一(One-to-One)和多对多(Many-to-Many)关系**: 这些是常见的关联关系,可以通过@OneToMany、@ManyToOne、@OneToOne和@ManyToMany注解进行配置。...
**JPA(Java Persistence API)**是Java平台上的一个标准,用于管理关系数据库中的数据,它简化了在Java...EJB3_JPA.doc和JPA_Basic.pdf可能包含了更详细的教程和实例,帮助读者进一步掌握JPA的核心技术和高级配置。
在IT行业中,Hibernate是一款广泛应用的关系对象映射框架,它极大地简化了Java开发人员与数据库...深入研究并实践这些知识,将有助于你更好地理解和应用Hibernate以及JPA2,从而在数据库驱动的Java应用开发中游刃有余。