7.8--SSH学习之注解关联映射

2024-02-09 15:18
文章标签 学习 注解 ssh 关联 映射 7.8

本文主要是介绍7.8--SSH学习之注解关联映射,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

之前记过配置文件方式的关联映射
可以参考:http://blog.csdn.net/su1573/article/details/74615709
现在记一下,用注解方式写的关联映射

单向多对一

只在多端配置;

多端:

@Entity(name="TABLE_STU")    //Entity标识本类为一个POJO类,name属性代表由这个类映射生成的表名//@TABLE(name="TABLE_STU"),还有其他属性,用table
public class Student {private Integer stuId;private String stuName;private String stuGender;private Integer stuAge;//单向多对一private Classes classes;@Id      //该属性为主键@GeneratedValue(strategy=GenerationType.AUTO)   //设置主键生成规则,AUTO为数据库默认生成主键//  @GeneratedValue(strategy=GenerationType.IDENTITY)  //设置主键生成规则,IDENTITY使用数据库自增列来生成主键,适用于MySQL,SqlServer,DB2等//  @GeneratedValue(strategy=GenerationType.SEQUENCE,generator="stuSeq")   //SEQUENCE使用序列作为主键生成规则,适用于Oracle,DB2等
//  @SequenceGenerator(name="stuSeq",sequenceName="STU_SEQ",initialValue=1,allocationSize=1)    //产生一个名为STU_SEQ的新序列,主键引用这个新序列//initialValue从1开始,allocationSize每次加一//  @GeneratedValue(generator="currGen")    //引用名为currGen的主键为生成规则,
//  @GenericGenerator(name="currGen",strategy="uuid")  //strategy="uuid"为uuid方式产生主键,strategy="assigned"手动插入产生规则@Column(name="STU_ID")            //括号中可以指定类型,columnDefinition="timestap",length,(insertable=false,增加数据时,这个列不出现在新增语句中)public Integer getStuId() {        //该属性对应的列名return stuId;                   }public void setStuId(Integer stuId) {this.stuId = stuId;}@Column(name="STU_NAME",length=200)public String getStuName() {return stuName;}public void setStuName(String stuName) {this.stuName = stuName;}@Column(name="STU_GENDER" ,length=50)public String getStuGender() {return stuGender;}public void setStuGender(String stuGender) {this.stuGender = stuGender;}@Column(name="STU_AGE")public Integer getStuAge() {return stuAge;}public void setStuAge(Integer stuAge) {this.stuAge = stuAge;}//单向多对一@ManyToOne(targetEntity=Classes.class,fetch=FetchType.EAGER,cascade=CascadeType.ALL)@JoinColumn(name="CLASSES_ID")                //cascade={CascadeType.PERSIST,CascadeType.MERGE}不能级联增加,但是all 可以//多对一public Classes getClasses() {return classes;}public void setClasses(Classes classes) {this.classes = classes;}
}


一端:

@Entity(name="TABLE_CLASSES")
public class Classes {@Id@GeneratedValue(strategy=GenerationType.AUTO)@Column(name="CLASSES_ID")private Integer classesId;@Column(name="CLASSES_NAME")private String classesName;//一对多
//  @OneToMany(targetEntity=Student.class,fetch=FetchType.EAGER,cascade=CascadeType.ALL)   //,mappedBy="classes"双向的时候写
//  @JoinColumn(name="CLASSES_ID")
//  private Set<Student> stuSet = new HashSet<Student>();//一对多public Integer getClassesId() {return classesId;}public void setClassesId(Integer classesId) {this.classesId = classesId;}public String getClassesName() {return classesName;}public void setClassesName(String classesName) {this.classesName = classesName;}
//  public Set<Student> getStuSet() {
//      return stuSet;
//  }
//  public void setStuSet(Set<Student> stuSet) {
//      this.stuSet = stuSet;
//  }
}



单向一对多

只在一段配置;

一端:

@Entity(name="TABLE_CLASSES")
public class Classes {@Id@GeneratedValue(strategy=GenerationType.AUTO)@Column(name="CLASSES_ID")private Integer classesId;@Column(name="CLASSES_NAME")private String classesName;//一对多@OneToMany(targetEntity=Student.class,fetch=FetchType.EAGER,cascade=CascadeType.ALL)   //,mappedBy="classes"双向的时候写@JoinColumn(name="CLASSES_ID")private Set<Student> stuSet = new HashSet<Student>();//一对多public Integer getClassesId() {return classesId;}public void setClassesId(Integer classesId) {this.classesId = classesId;}public String getClassesName() {return classesName;}public void setClassesName(String classesName) {this.classesName = classesName;}public Set<Student> getStuSet() {return stuSet;}public void setStuSet(Set<Student> stuSet) {this.stuSet = stuSet;}
}


多端:

@Entity(name="TABLE_STU")    //Entity标识本类为一个POJO类,name属性代表由这个类映射生成的表名//@TABLE(name="TABLE_STU"),还有其他属性,用table
public class Student {private Integer stuId;private String stuName;private String stuGender;private Integer stuAge;//单向多对一
//  private Classes classes;@Id      //该属性为主键@GeneratedValue(strategy=GenerationType.AUTO)   //设置主键生成规则,AUTO为数据库默认生成主键//  @GeneratedValue(strategy=GenerationType.IDENTITY)  //设置主键生成规则,IDENTITY使用数据库自增列来生成主键,适用于MySQL,SqlServer,DB2等//  @GeneratedValue(strategy=GenerationType.SEQUENCE,generator="stuSeq")   //SEQUENCE使用序列作为主键生成规则,适用于Oracle,DB2等
//  @SequenceGenerator(name="stuSeq",sequenceName="STU_SEQ",initialValue=1,allocationSize=1)    //产生一个名为STU_SEQ的新序列,主键引用这个新序列//initialValue从1开始,allocationSize每次加一//  @GeneratedValue(generator="currGen")    //引用名为currGen的主键为生成规则,
//  @GenericGenerator(name="currGen",strategy="uuid")  //strategy="uuid"为uuid方式产生主键,strategy="assigned"手动插入产生规则@Column(name="STU_ID")            //括号中可以指定类型,columnDefinition="timestap",length,(insertable=false,增加数据时,这个列不出现在新增语句中)public Integer getStuId() {        //该属性对应的列名return stuId;                   }public void setStuId(Integer stuId) {this.stuId = stuId;}@Column(name="STU_NAME",length=200)public String getStuName() {return stuName;}public void setStuName(String stuName) {this.stuName = stuName;}@Column(name="STU_GENDER" ,length=50)public String getStuGender() {return stuGender;}public void setStuGender(String stuGender) {this.stuGender = stuGender;}@Column(name="STU_AGE")public Integer getStuAge() {return stuAge;}public void setStuAge(Integer stuAge) {this.stuAge = stuAge;}//单向多对一
//  @ManyToOne(targetEntity=Classes.class,fetch=FetchType.EAGER,cascade=CascadeType.ALL)
//  @JoinColumn(name="CLASSES_ID")                //cascade={CascadeType.PERSIST,CascadeType.MERGE}不能级联增加,但是all 可以//多对一
//  public Classes getClasses() {
//      return classes;
//  }
//  public void setClasses(Classes classes) {
//      this.classes = classes;
//  }
}



双向多对一

在多端配置:
@ManyToOne()
@JoinColumn()
在一端配置:
@OneToMany(….,mappedBy=”classes”)
mappedBy属性如果设置则表明这一段放弃控制权

多端:

@Entity(name="TABLE_STU")    //Entity标识本类为一个POJO类,name属性代表由这个类映射生成的表名//@TABLE(name="TABLE_STU"),还有其他属性,用table
public class Student {private Integer stuId;private String stuName;private String stuGender;private Integer stuAge;//单向多对一private Classes classes;@Id      //该属性为主键@GeneratedValue(strategy=GenerationType.AUTO)   //设置主键生成规则,AUTO为数据库默认生成主键//  @GeneratedValue(strategy=GenerationType.IDENTITY)  //设置主键生成规则,IDENTITY使用数据库自增列来生成主键,适用于MySQL,SqlServer,DB2等//  @GeneratedValue(strategy=GenerationType.SEQUENCE,generator="stuSeq")   //SEQUENCE使用序列作为主键生成规则,适用于Oracle,DB2等
//  @SequenceGenerator(name="stuSeq",sequenceName="STU_SEQ",initialValue=1,allocationSize=1)    //产生一个名为STU_SEQ的新序列,主键引用这个新序列//initialValue从1开始,allocationSize每次加一//  @GeneratedValue(generator="currGen")    //引用名为currGen的主键为生成规则,
//  @GenericGenerator(name="currGen",strategy="uuid")  //strategy="uuid"为uuid方式产生主键,strategy="assigned"手动插入产生规则@Column(name="STU_ID")            //括号中可以指定类型,columnDefinition="timestap",length,(insertable=false,增加数据时,这个列不出现在新增语句中)public Integer getStuId() {        //该属性对应的列名return stuId;                   }public void setStuId(Integer stuId) {this.stuId = stuId;}@Column(name="STU_NAME",length=200)public String getStuName() {return stuName;}public void setStuName(String stuName) {this.stuName = stuName;}@Column(name="STU_GENDER" ,length=50)public String getStuGender() {return stuGender;}public void setStuGender(String stuGender) {this.stuGender = stuGender;}@Column(name="STU_AGE")public Integer getStuAge() {return stuAge;}public void setStuAge(Integer stuAge) {this.stuAge = stuAge;}//单向多对一@ManyToOne(targetEntity=Classes.class,fetch=FetchType.EAGER,cascade=CascadeType.ALL)@JoinColumn(name="CLASSES_ID")                //cascade={CascadeType.PERSIST,CascadeType.MERGE}不能级联增加,但是all 可以//多对一public Classes getClasses() {return classes;}public void setClasses(Classes classes) {this.classes = classes;}
}


一端:

@Entity(name="TABLE_CLASSES")
public class Classes {@Id@GeneratedValue(strategy=GenerationType.AUTO)@Column(name="CLASSES_ID")private Integer classesId;@Column(name="CLASSES_NAME")private String classesName;//一对多@OneToMany(targetEntity=Student.class,fetch=FetchType.EAGER,cascade=CascadeType.ALL)   //,mappedBy="classes"双向的时候写
//  @JoinColumn(name="CLASSES_ID")private Set<Student> stuSet = new HashSet<Student>();//一对多public Integer getClassesId() {return classesId;}public void setClassesId(Integer classesId) {this.classesId = classesId;}public String getClassesName() {return classesName;}public void setClassesName(String classesName) {this.classesName = classesName;}public Set<Student> getStuSet() {return stuSet;}public void setStuSet(Set<Student> stuSet) {this.stuSet = stuSet;}
}



多对多

两端都要写配置;

学生端:

@Entity(name="TABLE_TWOSTU")    //Entity标识本类为一个POJO类,name属性代表由这个类映射生成的表名//@TABLE(name="TABLE_STU"),还有其他属性,用table
public class TwoStudent {private Integer stuId;private String stuName;private String stuGender;private Integer stuAge;private Set<Teacher> stuTea = new HashSet<Teacher>();@Id      //该属性为主键@GeneratedValue(strategy=GenerationType.AUTO)   //设置主键生成规则,AUTO为数据库默认生成主键@Column(name="STU_ID")            //括号中可以指定类型,columnDefinition="timestap",length,(insertable=false,增加数据时,这个列不出现在新增语句中)public Integer getStuId() {        //该属性对应的列名return stuId;                   }public void setStuId(Integer stuId) {this.stuId = stuId;}@Column(name="STU_NAME",length=200)public String getStuName() {return stuName;}public void setStuName(String stuName) {this.stuName = stuName;}@Column(name="STU_GENDER" ,length=50)public String getStuGender() {return stuGender;}public void setStuGender(String stuGender) {this.stuGender = stuGender;}@Column(name="STU_AGE")public Integer getStuAge() {return stuAge;}public void setStuAge(Integer stuAge) {this.stuAge = stuAge;}@ManyToMany(targetEntity=Teacher.class,fetch=FetchType.EAGER,cascade=CascadeType.ALL)@JoinTable(name="TABLE_TEA_STU",joinColumns={@JoinColumn(name="STU_ID")},inverseJoinColumns={@JoinColumn(name="TEA_ID")})public Set<Teacher> getStuTea() {return stuTea;}public void setStuTea(Set<Teacher> stuTea) {this.stuTea = stuTea;}
}


教师端:

@Entity
public class Teacher {private Integer teaId;private String teaName;private String teaPwd;private Set<TwoStudent> stuSet = new HashSet<TwoStudent>();@Id@GeneratedValue(strategy=GenerationType.AUTO)@Column(name="TEA_ID")public Integer getTeaId() {return teaId;}public void setTeaId(Integer teaId) {this.teaId = teaId;}@Column(name="TEA_NAME", length=200,nullable=false)public String getTeaName() {return teaName;}public void setTeaName(String teaName) {this.teaName = teaName;}@Column(name="TEA_PWD", length=200,nullable=false)public String getTeaPwd() {return teaPwd;}public void setTeaPwd(String teaPwd) {this.teaPwd = teaPwd;}@ManyToMany(targetEntity=TwoStudent.class,cascade=CascadeType.ALL,fetch=FetchType.EAGER)@JoinTable(name="TABLE_TEA_STU",joinColumns={@JoinColumn(name="TEA_ID")},inverseJoinColumns={@JoinColumn(name="STU_ID")})public Set<TwoStudent> getStuSet() {return stuSet;}public void setStuSet(Set<TwoStudent> stuSet) {this.stuSet = stuSet;}
}



一对一

两端也都要配置;

学生端:

@Entity(name="TABLE_THREESTU")
public class ThreeStudent {private Integer stuId;private String stuName;private String stuGender;private Integer stuAge;private StudentCard studentCard;@Id@GeneratedValue(strategy=GenerationType.AUTO)@Column(name="STU_ID")public Integer getStuId() {return stuId;}public void setStuId(Integer stuId) {this.stuId = stuId;}@Column(name="STU_NAME",length=200)public String getStuName() {return stuName;}public void setStuName(String stuName) {this.stuName = stuName;}@Column(name="STU_GENDER",length=50)public String getStuGender() {return stuGender;}public void setStuGender(String stuGender) {this.stuGender = stuGender;}@Column(name="STU_AGE")public Integer getStuAge() {return stuAge;}public void setStuAge(Integer stuAge) {this.stuAge = stuAge;}@OneToOne(targetEntity=StudentCard.class,cascade=CascadeType.ALL,fetch=FetchType.EAGER)@PrimaryKeyJoinColumnpublic StudentCard getStudentCard() {return studentCard;}public void setStudentCard(StudentCard studentCard) {this.studentCard = studentCard;}
}


学生卡端:

@Entity(name="TAB_CARD")
public class StudentCard {private Integer cardId;private String cardNum;private ThreeStudent threeStudent;@Id@GeneratedValue(generator="cardStuKey")@GenericGenerator(name="cardStuKey",strategy="foreign",parameters=@Parameter(name="property", value="threeStudent"))@Column(name="CARD_ID")public Integer getCardId() {return cardId;}public void setCardId(Integer cardId) {this.cardId = cardId;}@Column(name="CARD_NUM",length=200)public String getCardNum() {return cardNum;}public void setCardNum(String cardNum) {this.cardNum = cardNum;}@OneToOne(targetEntity=ThreeStudent.class,cascade=CascadeType.ALL,fetch=FetchType.EAGER,mappedBy="studentCard")@PrimaryKeyJoinColumnpublic ThreeStudent getThreeStudent() {return threeStudent;}public void setThreeStudent(ThreeStudent threeStudent) {this.threeStudent = threeStudent;}
}




配置文件中需要写:

         <mapping class="com.su.domain.Student"/><mapping class="com.su.domain.Classes"/><mapping class="com.su.domain.Teacher"/><mapping class="com.su.domain.TwoStudent"/><mapping class="com.su.domain.ThreeStudent"/><mapping class="com.su.domain.StudentCard"/>



然后运读取配置文件的代码,即可在数据库自动建表:

public class HibernateTest {public static void main(String[] args) {// 默认读取hibernate.cfg.xml文件Configuration cfg = new Configuration().configure();// 生成并输出sql到文件(当前目录)和数据库 SchemaExport se = new SchemaExport(cfg);// 创建表结构,第一个true 表示在控制台打印sql语句,第二个true 表示导入sql语句到数据库se.create(true, true);      }}



控制台显示成功信息如下:

INFO: HHH000046: Connection properties: {user=ssss, password=****}
七月 09, 2017 10:45:45 下午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000006: Autocommit mode: false
七月 09, 2017 10:45:45 下午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
INFO: HHH000115: Hibernate connection pool size: 1 (min=1)drop table TABLE_TEA_STU cascade constraintsdrop table TABLE_TWOSTU cascade constraintsdrop table Teacher cascade constraintsdrop sequence hibernate_sequencecreate table TABLE_TEA_STU (STU_ID number(10,0) not null,TEA_ID number(10,0) not null,primary key (TEA_ID, STU_ID))create table TABLE_TWOSTU (STU_ID number(10,0) not null,STU_AGE number(10,0),STU_GENDER varchar2(50 char),STU_NAME varchar2(200 char),primary key (STU_ID))create table Teacher (TEA_ID number(10,0) not null,TEA_NAME varchar2(200 char) not null,TEA_PWD varchar2(200 char) not null,primary key (TEA_ID))alter table TABLE_TEA_STU add constraint FK_dnnscrifuvtxpg4t3c9oo1aaq foreign key (TEA_ID) references Teacheralter table TABLE_TEA_STU add constraint FK_feeoifq2kgnybn2rvw4muoq8p foreign key (STU_ID) references TABLE_TWOSTUcreate sequence hibernate_sequence
七月 09, 2017 10:45:46 下午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl stop
INFO: HHH000030: Cleaning up connection pool [jdbc:oracle:thin:@localhost:1521:xe]
七月 09, 2017 10:45:46 下午 org.hibernate.tool.hbm2ddl.SchemaExport execute
INFO: HHH000230: Schema export complete

完结!!!


Author:su1573

这篇关于7.8--SSH学习之注解关联映射的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/694561

相关文章

解决IDEA报错:编码GBK的不可映射字符问题

《解决IDEA报错:编码GBK的不可映射字符问题》:本文主要介绍解决IDEA报错:编码GBK的不可映射字符问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录IDEA报错:编码GBK的不可映射字符终端软件问题描述原因分析解决方案方法1:将命令改为方法2:右下jav

Java 中的 @SneakyThrows 注解使用方法(简化异常处理的利与弊)

《Java中的@SneakyThrows注解使用方法(简化异常处理的利与弊)》为了简化异常处理,Lombok提供了一个强大的注解@SneakyThrows,本文将详细介绍@SneakyThro... 目录1. @SneakyThrows 简介 1.1 什么是 Lombok?2. @SneakyThrows

Java Spring 中 @PostConstruct 注解使用原理及常见场景

《JavaSpring中@PostConstruct注解使用原理及常见场景》在JavaSpring中,@PostConstruct注解是一个非常实用的功能,它允许开发者在Spring容器完全初... 目录一、@PostConstruct 注解概述二、@PostConstruct 注解的基本使用2.1 基本代

Java学习手册之Filter和Listener使用方法

《Java学习手册之Filter和Listener使用方法》:本文主要介绍Java学习手册之Filter和Listener使用方法的相关资料,Filter是一种拦截器,可以在请求到达Servl... 目录一、Filter(过滤器)1. Filter 的工作原理2. Filter 的配置与使用二、Listen

Java中的@SneakyThrows注解用法详解

《Java中的@SneakyThrows注解用法详解》:本文主要介绍Java中的@SneakyThrows注解用法的相关资料,Lombok的@SneakyThrows注解简化了Java方法中的异常... 目录前言一、@SneakyThrows 简介1.1 什么是 Lombok?二、@SneakyThrows

CentOS7更改默认SSH端口与配置指南

《CentOS7更改默认SSH端口与配置指南》SSH是Linux服务器远程管理的核心工具,其默认监听端口为22,由于端口22众所周知,这也使得服务器容易受到自动化扫描和暴力破解攻击,本文将系统性地介绍... 目录引言为什么要更改 SSH 默认端口?步骤详解:如何更改 Centos 7 的 SSH 默认端口1

SQL表间关联查询实例详解

《SQL表间关联查询实例详解》本文主要讲解SQL语句中常用的表间关联查询方式,包括:左连接(leftjoin)、右连接(rightjoin)、全连接(fulljoin)、内连接(innerjoin)、... 目录简介样例准备左外连接右外连接全外连接内连接交叉连接自然连接简介本文主要讲解SQL语句中常用的表

SpringRetry重试机制之@Retryable注解与重试策略详解

《SpringRetry重试机制之@Retryable注解与重试策略详解》本文将详细介绍SpringRetry的重试机制,特别是@Retryable注解的使用及各种重试策略的配置,帮助开发者构建更加健... 目录引言一、SpringRetry基础知识二、启用SpringRetry三、@Retryable注解

SpringValidation数据校验之约束注解与分组校验方式

《SpringValidation数据校验之约束注解与分组校验方式》本文将深入探讨SpringValidation的核心功能,帮助开发者掌握约束注解的使用技巧和分组校验的高级应用,从而构建更加健壮和可... 目录引言一、Spring Validation基础架构1.1 jsR-380标准与Spring整合1

SpringBoot条件注解核心作用与使用场景详解

《SpringBoot条件注解核心作用与使用场景详解》SpringBoot的条件注解为开发者提供了强大的动态配置能力,理解其原理和适用场景是构建灵活、可扩展应用的关键,本文将系统梳理所有常用的条件注... 目录引言一、条件注解的核心机制二、SpringBoot内置条件注解详解1、@ConditionalOn