*****************关于注解的简单介绍

详细介绍请点击这里注解详细教程

package com.tomowork.pojo;

import org.hibernate.annotations.GenericGenerator;

import javax.annotation.Generated;
import javax.persistence.*;
import java.io.Serializable; @Entity() //表明这个类是一个实体类,在数据库中存在对应的字段
@Table(name="emp",schema = "test") //在数据库中对应的表
public class Emp implements Serializable {
private Integer empno ;
private String ename ;
@Id
/**
* 可选的主键的生成策略
* 可选的值:
TABLE,
SEQUENCE, //主要用于Oracle数据库
IDENTITY,
AUTO; //根据数据库定义主键生成策略,myql底层是自动增长主列
@GeneratedValue(strategy = GenerationType.AUTO)
*/
/**
* 如果主键是指派的,就不能用jpa注解
*/
@GeneratedValue(generator = "deptno") //定义一个主键生成策略
@GenericGenerator(name = "deptno",strategy = "assigned")
public Integer getEmpno() {
return empno;
} public void setEmpno(Integer empno) {
this.empno = empno;
}
@Column(name = "ename")
public String getEname() {
return ename;
} public void setEname(String ename) {
this.ename = ename;
}
}

****************注解开发单向一对一

  编写数据库脚本:

    假如一个学生只有一部手机,一个手机只属于一个学生;

CREATE TABLE `phone` (
`tel` varchar(255) NOT NULL DEFAULT '' COMMENT '手机号码',
`pname` varchar(255) NOT NULL COMMENT '手机名字',
`price` double NOT NULL COMMENT '手机价格',
`sid` int(11) NOT NULL COMMENT '手机的主人',
PRIMARY KEY (`tel`),
KEY `fk_sid` (`sid`),
CONSTRAINT `fk_sid` FOREIGN KEY (`sid`) REFERENCES `students` (`sid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `students` (
`sid` int(11) NOT NULL DEFAULT '0',
`sname` varchar(255) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
PRIMARY KEY (`sid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

  编写实体类:

    Students.java

package com.itcloud.pojo;

import org.hibernate.annotations.GenericGenerator;

import javax.persistence.*;

@Entity //表明这是一个数据库实体
@Table(name="Students")
public class Students {
//统一代码规范将注解设置在get方法上面而不是设置在属性上面
private Integer sid ;
private String sname ;
private Integer age ;
//无参构造
public Students(){}
//全参构造
public Students(Integer sid, String sname, Integer age) {
this.sid = sid;
this.sname = sname;
this.age = age;
} @Id //表示这是一个主键列
//定义主键的生成策略,assigned表示是自己指派的
@GeneratedValue(generator = "sid")
@GenericGenerator(name="sid",strategy = "assigned")
public Integer getSid() {
return sid;
} public void setSid(Integer sid) {
this.sid = sid;
} /**
*Basic,定义属性的存取获取策略
*Basic(FetchType.EAGER):默认,表示即时存取
*Basic(FetchType.LAZY):延迟加载
*/
@Basic //这里设置默认就可以了
@Column(length =13,name="sname" )
public String getSname() {
return sname;
} public void setSname(String sname) {
this.sname = sname;
}
@Basic
@Column(name = "age")
public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
}
}

  Phone.java

package com.itcloud.pojo;

import org.hibernate.annotations.GenericGenerator;

import javax.persistence.*;

@Entity
@Table(name="phone",schema = "test")
public class Phone {
private String tel ;
private String pname ;
private Double price ;
private Students students ; public Phone() {
} public Phone(String tel, String pname, Double price, Students students) {
this.tel = tel;
this.pname = pname;
this.price = price;
this.students = students;
} @Id
@GeneratedValue(generator = "tel")
@GenericGenerator(name = "tel",strategy="assigned") //自己指派主键生成策略
public String getTel() {
return tel;
} public void setTel(String tel) {
this.tel = tel;
}
@Basic
@Column(name="pname")
public String getPname() {
return pname;
} public void setPname(String pname) {
this.pname = pname;
}
@Basic
@Column(name="price")
public Double getPrice() {
return price;
} public void setPrice(Double price) {
this.price = price;
} /**
*进行单项一对一的关联映射
*/ @OneToOne(cascade = CascadeType.ALL) //全部级联CRUD操作
@JoinColumn(name="sid",unique = true) //name指的是主表的外键,unique表示是否是唯一的
public Students getStudents() {
return students;
} public void setStudents(Students students) {
this.students = students;
}
}

  测试用例:

package com.itcloud.test;

import com.itcloud.pojo.Phone;
import com.itcloud.pojo.Students;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.After;
import org.junit.Test; public class TestHibernate {
public static SessionFactory sessionFactory =null ;
public static Session session = null ;
public static Transaction transaction ;
static {
Configuration configuration = new Configuration().configure() ;
sessionFactory = configuration.buildSessionFactory() ;
session = sessionFactory.openSession() ;
transaction = session.beginTransaction() ;
}
@Test
public void post(){
//创建学生实体
Students stus = new Students(201401,"张三",10) ;
Phone phone = new Phone("13588578866","iphone",888.36,stus) ;
session.save(stus) ;
session.save(phone) ;
} @After
public void destroy(){
transaction.commit();
session.close();
sessionFactory.close();
}
}

  测试结果:

Hibernate:
insert
into
Students
(age, sname, sid)
values
(?, ?, ?) Hibernate: 十二月 02, 2017 12:19:41 上午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl stop
insert
into phoneINFO: HHH10001008: Cleaning up connection pool [jdbc:mysql://localhost:3306/test?characterEncoding=UTF-8]
(pname, price, sid, tel)
values
(?, ?, ?, ?)

***********注解开发一对一双向

数据库表结构

CREATE TABLE `students` (
`sid` int(11) NOT NULL,
`sname` varchar(15) NOT NULL DEFAULT '',
`age` int(11) NOT NULL DEFAULT '0',
`tel` varchar(18) NOT NULL DEFAULT '' COMMENT '一个学生有一部手机',
PRIMARY KEY (`sid`),
KEY `fk_tel` (`tel`),
CONSTRAINT `fk_tel` FOREIGN KEY (`tel`) REFERENCES `phone` (`tel`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `phone` (
`tel` varchar(18) NOT NULL,
`pname` varchar(20) NOT NULL DEFAULT '' COMMENT '手机名字',
`price` double NOT NULL DEFAULT '0' COMMENT '手机价格',
PRIMARY KEY (`tel`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

    假如一个学生拥有一个手机,一个手机属于一个学生,学生为主控方

    实体类的编写

      Students

package com.itcloud.pojo;

import org.hibernate.annotations.GenericGenerator;

import javax.persistence.*;
import java.io.Serializable; @Entity //表明这是一个数据库实体
@Table(name="students")
public class Students implements Serializable {
//统一代码规范将注解设置在get方法上面而不是设置在属性上面
private Integer sid ;
private String sname ;
private Integer age ;
private Phone phone ;//一个学生拥有一个手机
//无参构造
public Students(){}
//全参构造
public Students(Integer sid, String sname, Integer age) {
this.sid = sid;
this.sname = sname;
this.age = age;
} @Id //表示这是一个主键列
//定义主键的生成策略,assigned表示是自己指派的
@GeneratedValue(generator = "sid")
@GenericGenerator(name="sid",strategy = "assigned")
public Integer getSid() {
return sid;
} public void setSid(Integer sid) {
this.sid = sid;
} /**
*Basic,定义属性的存取获取策略
*Basic(FetchType.EAGER):默认,表示即时存取
*Basic(FetchType.LAZY):延迟加载
*/
@Basic //这里设置默认就可以了
@Column(name="sname" )
public String getSname() {
return sname;
} public void setSname(String sname) {
this.sname = sname;
}
@Basic
@Column(name = "age")
public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
} @OneToOne(cascade = CascadeType.ALL,fetch = FetchType.LAZY)
@JoinColumn(name="tel",unique = true) //name指的是主表的外键,数据库中的外键,unique表示是否是唯一的
public Phone getPhone() {
return phone;
}
public void setPhone(Phone phone) {
this.phone = phone;
}
}

    Phones.java

 package com.itcloud.pojo;

 import org.hibernate.annotations.GenericGenerator;

 import javax.persistence.*;
import java.io.Serializable; @Entity
@Table(name="phone",schema = "test")
public class Phone implements Serializable {
private String tel ;
private String pname ;
private Double price ; private Students students ; //一个手机属于一个学生 public Phone() {
} public Phone(String tel, String pname, Double price) {
this.tel = tel;
this.pname = pname;
this.price = price;
} @Id
@GeneratedValue(generator = "tel")
@GenericGenerator(name = "tel",strategy="assigned") //自己指派主键生成策略
public String getTel() {
return tel;
} public void setTel(String tel) {
this.tel = tel;
}
@Basic
@Column(name="pname")
public String getPname() {
return pname;
} public void setPname(String pname) {
this.pname = pname;
}
@Basic
@Column(name="price")
public Double getPrice() {
return price;
} public void setPrice(Double price) {
this.price = price;
} @OneToOne(mappedBy = "phone",fetch = FetchType.LAZY) //主表类中的从表实例
public Students getStudents() {
return students;
} public void setStudents(Students students) {
this.students = students;
}
}

测试用例:

  @Test
public void post(){
//创建学生实体
Phone phone = new Phone("13588578867","iphone",888.36) ;
Students stus = new Students(201402,"李四",10) ;
stus.setPhone(phone);
phone.setStudents(stus);
session.save(phone) ; //一定要保存手机,再保存学生
session.save(stus) ;
}

双向一对一总结:

  首先表设计:主表:students,存在有phone的外键

        从表:没有外键,数据交给students管理;

  实体类的设计:主表:        

          @OneToOne(cascade = CascadeType.ALL,fetch = FetchType.LAZY)
         @JoinColumn(name="tel",unique = true) //name指的是主表的外键,数据库中的外键,unique表示是否是唯一的

         从表:

    @OneToOne(mappedBy = "phone",fetch = FetchType.LAZY) //phone为主表类中的从表实例即:private Phone phone ;中的phone

 ***********单方多对一关联关系:

  假设一个部门拥有多个雇员,一个雇员属于一个部门,典型的多对一关联

   首先表设计:  

CREATE TABLE `dept` (
`deptno` int(11) NOT NULL DEFAULT '0',
`dname` varchar(255) DEFAULT '',
`loc` varchar(255) DEFAULT '',
PRIMARY KEY (`deptno`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `emp` (
`empno` int(11) NOT NULL,
`ename` varchar(15) NOT NULL DEFAULT '' COMMENT '雇员姓名',
`job` varchar(25) NOT NULL DEFAULT '' COMMENT '雇员职位',
`deptno` int(11) NOT NULL DEFAULT '-1' COMMENT '所属部门,-1表示没有部门',
PRIMARY KEY (`empno`),
KEY `fk_deptno` (`deptno`),
CONSTRAINT `fk_deptno` FOREIGN KEY (`deptno`) REFERENCES `dept` (`deptno`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

实体类的编写

  Dept.java(多方)

package com.itcloud.pojo;

import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
/**
* @author:itcloud
*
*/
public class Dept {
private Integer deptno;
private String dname;
private String loc; public Dept() {
} public Dept(Integer deptno, String dname, String loc) {
this.deptno = deptno;
this.dname = dname;
this.loc = loc;
} @Id
@Column(name = "deptno")
public int getDeptno() {
return deptno;
} public void setDeptno(int deptno) {
this.deptno = deptno;
} @Basic
@Column(name = "dname")
public String getDname() {
return dname;
} public void setDname(String dname) {
this.dname = dname;
} @Basic
@Column(name = "loc")
public String getLoc() {
return loc;
} public void setLoc(String loc) {
this.loc = loc;
} @Override
public boolean equals(Object o) {
if (this == o) {return true;}
if (o == null || getClass() != o.getClass()){ return false;} Dept dept = (Dept) o; if (deptno != dept.deptno) {return false;}
if (dname != null ? !dname.equals(dept.dname) : dept.dname != null) {return false;}
if (loc != null ? !loc.equals(dept.loc) : dept.loc != null) {return false;} return true;
} @Override
public int hashCode() {
int result = deptno;
result = 31 * result + (dname != null ? dname.hashCode() : 0);
result = 31 * result + (loc != null ? loc.hashCode() : 0);
return result;
} @Override
public String toString() {
return "Dept{" +
"deptno=" + deptno +
", dname='" + dname + '\'' +
", loc='" + loc + '\'' +
'}';
}
}

Emp.java(一方)

package com.itcloud.pojo;

import org.hibernate.annotations.GenericGenerator;

import javax.persistence.*;

@Entity
@Table(name = "emp",schema = "test")
public class Emp { private Integer empno ;
private String ename ;
private String job ; private Dept dept ; public Emp() {
} public Emp(Integer empno, String ename, String job, Dept dept) {
this.empno = empno;
this.ename = ename;
this.job = job;
this.dept = dept;
} /**
* emp是多方,dept是一方
*
*/
@ManyToOne(cascade = CascadeType.ALL,fetch = FetchType.EAGER) //抓取策略是积极的
@JoinColumn(name = "deptno")//deptno是外键
public Dept getDept() {
return dept;
} public void setDept(Dept dept) {
this.dept = dept;
} @Id
@GeneratedValue(generator = "empno")
@GenericGenerator(name="empno",strategy = "assigned")
public Integer getEmpno() {
return empno;
} public void setEmpno(Integer empno) {
this.empno = empno;
}
@Column(name="ename")
public String getEname() {
return ename;
} public void setEname(String ename) {
this.ename = ename;
}
@Column(name="job")
public String getJob() {
return job;
} public void setJob(String job) {
this.job = job;
}
}

测试用例:

    @Test
public void post(){
//多对一测试
Dept dept = new Dept(11,"运维部门","402");
Emp emp = new Emp(7371,"clom","linux运维",dept) ;
session.save(dept) ;
session.save(emp) ;
}

测试结果:

Hibernate:
insert
into
Dept
(dname, loc, deptno)
values
(?, ?, ?)
Hibernate:
insert
into
emp
(deptno, ename, job, empno)
values
(?, ?, ?, ?)

多对一在多方(即Emp.java)上面添加如下注解

...   
/**
* emp是多方,dept是一方
*
*/
@ManyToOne(cascade = CascadeType.ALL,fetch = FetchType.EAGER) //抓取策略是积极的
@JoinColumn(name = "deptno")//deptno是外键
public Dept getDept() {
return dept;
}
...

***********一对多单向外键关联

一方持有多方的集合 :一个部门存在多个雇员,但是雇员不是重复的,在Dept.java中添加:private  Set<Emp> allEmps = new HashSet<>() ;

数据表:还是dept,emp这两个表

编写实体类

Dept.java

package com.itcloud.pojo;

import org.hibernate.annotations.GenericGenerator;

import javax.persistence.*;
import java.util.HashSet;
import java.util.Set; @Entity
@Table(name = "dept")
public class Dept { private Integer deptno ;
private String dname ;
private String loc ; private Set<Emp> emps = new HashSet<>() ; @Id
@GeneratedValue(generator = "dno")
@GenericGenerator(name="dno",strategy = "assigned")
public Integer getDeptno() {
return deptno;
} public void setDeptno(Integer deptno) {
this.deptno = deptno;
} public String getDname() {
return dname;
} public void setDname(String dname) {
this.dname = dname;
} public String getLoc() {
return loc;
} public void setLoc(String loc) {
this.loc = loc;
} @OneToMany(cascade = CascadeType.ALL,fetch = FetchType.LAZY)
@JoinColumn(name = "deptno",updatable = false)
public Set<Emp> getEmps() {
return emps;
} public void setEmps(Set<Emp> emps) {
this.emps = emps;
}
}

Emp.java

package com.itcloud.pojo;

import org.hibernate.annotations.GenericGenerator;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table; @Entity
@Table(name="emp")
public class Emp { private Integer empno ;
private String ename ;
private String job ; public Emp() {
} public Emp(Integer empno, String ename, String job) {
this.empno = empno;
this.ename = ename;
this.job = job;
} @Id
@GeneratedValue(generator = "eno")
@GenericGenerator(name = "eno",strategy = "assigned")
public Integer getEmpno() {
return empno;
} public void setEmpno(Integer empno) {
this.empno = empno;
} public String getEname() {
return ename;
} public void setEname(String ename) {
this.ename = ename;
} public String getJob() {
return job;
} public void setJob(String job) {
this.job = job;
}
}

测试用例:

 @Test
public void post(){
Dept dept = new Dept() ;
dept.setDeptno(11);
dept.setDname("开发部门");
dept.setLoc("403"); Emp emp1 = new Emp(7777,"smith","java开发") ;
Emp emp2 = new Emp(7778,"jack","后端开发") ; dept.getEmps().add(emp1) ;
dept.getEmps().add(emp2) ; session.save(emp1) ;
session.save(emp2) ;
session.save(dept) ; }

***********1-N(N-1)双向外键关联

package com.itcloud.pojo;

import javax.persistence.*;
import java.util.HashSet;
import java.util.Set; @Entity
public class Dept {
private int deptno;
private String dname;
private String loc;
private Set<Emp> emps = new HashSet<>(); @Id
@Column(name = "deptno", nullable = false)
public int getDeptno() {
return deptno;
} public void setDeptno(int deptno) {
this.deptno = deptno;
} @Basic
@Column(name = "dname", nullable = true, length = 255)
public String getDname() {
return dname;
} public void setDname(String dname) {
this.dname = dname;
} @Basic
@Column(name = "loc", nullable = true, length = 255)
public String getLoc() {
return loc;
} public void setLoc(String loc) {
this.loc = loc;
} @Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false; Dept dept = (Dept) o; if (deptno != dept.deptno) return false;
if (dname != null ? !dname.equals(dept.dname) : dept.dname != null) return false;
if (loc != null ? !loc.equals(dept.loc) : dept.loc != null) return false; return true;
} @Override
public int hashCode() {
int result = deptno;
result = 31 * result + (dname != null ? dname.hashCode() : 0);
result = 31 * result + (loc != null ? loc.hashCode() : 0);
return result;
} @OneToMany(cascade = CascadeType.ALL,fetch = FetchType.LAZY)
@JoinColumn(name="deptno")
public Set<Emp> getEmps() {
return emps;
} public void setEmps(Set<Emp> emps) {
this.emps = emps;
}
}
package com.itcloud.pojo;

import javax.persistence.*;

@Entity
public class Emp {
private int empno;
private String ename;
private String job;
private Dept dept; public Emp(int empno, String ename, String job) {
this.empno = empno;
this.ename = ename;
this.job = job;
} @Id
@Column(name = "empno", nullable = false)
public int getEmpno() {
return empno;
} public void setEmpno(int empno) {
this.empno = empno;
} @Basic
@Column(name = "ename", nullable = true, length = 255)
public String getEname() {
return ename;
} public void setEname(String ename) {
this.ename = ename;
} @Basic
@Column(name = "job", nullable = true, length = 255)
public String getJob() {
return job;
} public void setJob(String job) {
this.job = job;
} @Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false; Emp emp = (Emp) o; if (empno != emp.empno) return false;
if (ename != null ? !ename.equals(emp.ename) : emp.ename != null) return false;
if (job != null ? !job.equals(emp.job) : emp.job != null) return false; return true;
} @Override
public int hashCode() {
int result = empno;
result = 31 * result + (ename != null ? ename.hashCode() : 0);
result = 31 * result + (job != null ? job.hashCode() : 0);
return result;
} @ManyToOne(cascade = CascadeType.ALL,fetch = FetchType.EAGER)
@JoinColumn(name = "deptno", referencedColumnName = "deptno")
public Dept getDept() {
return dept;
} public void setDept(Dept dept) {
this.dept = dept;
}
}

注意點:

  1.无论是在多方还是在一方,都要加上:@JoinColumn(name="deptno")这一语句,如果不加则无法级联,deptno为多方的外键,

  2.不要加mappedBy这一属性,因为加上这一属性只可以从多方进行级联,而一方无法进行级联,就需要设置①,②两个字段

測試:


 @Test
public void post(){
Dept dept = new Dept() ;
dept.setDeptno(11);
dept.setDname("开发部门");
dept.setLoc("313"); Emp emp1 = new Emp(7777,"smith","java开发") ;
Emp emp2 = new Emp(7778,"jack","后端开发") ; dept.getEmps().add(emp1) ;
dept.getEmps().add(emp2) ;
// emp1.setDept(dept);//②
// emp2.setDept(dept);//①
session.save(emp1) ;
session.save(emp2) ;
session.save(dept) ; }

結果

Hibernate:
insert
into
Emp
(deptno, ename, job, empno)
values
(?, ?, ?, ?)
Hibernate:
insert
into
Emp
(deptno, ename, job, empno)
values
(?, ?, ?, ?)
Hibernate:
insert
into
Dept
(dname, loc, deptno)
values
(?, ?, ?)
Hibernate:
update
Emp
set
deptno=?
where
empno=?
Hibernate:
update
Emp
set
deptno=?
where
empno=?

************多对多外键关联

表结构:

CREATE TABLE `teachers` (
`tid` int(11) NOT NULL,
`tname` varchar(255) NOT NULL DEFAULT '',
PRIMARY KEY (`tid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `students` (
`sid` int(11) NOT NULL,
`sname` varchar(15) NOT NULL DEFAULT '',
PRIMARY KEY (`sid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- 中间关系维护表
CREATE TABLE `stu_teach` (
`tid` int(11) NOT NULL,
`sid` int(11) NOT NULL,
KEY `FKt56181amkhrdpmd2ici8ngp35` (`sid`),
KEY `FKe9ifjo0m9y756vlrgmb8oygsa` (`tid`),
CONSTRAINT `FKe9ifjo0m9y756vlrgmb8oygsa` FOREIGN KEY (`tid`) REFERENCES `teachers` (`tid`),
CONSTRAINT `FKt56181amkhrdpmd2ici8ngp35` FOREIGN KEY (`sid`) REFERENCES `students` (`sid`),-- 这里面的外键是开发工具加的,不知道为啥mmp
CONSTRAINT `fk_sid` FOREIGN KEY (`sid`) REFERENCES `students` (`sid`) ON DELETE NO ACTION ON UPDATE CASCADE,
CONSTRAINT `fk_tid` FOREIGN KEY (`tid`) REFERENCES `teachers` (`tid`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
@ManyToMany
@JoinTable(
name = "stu_teach",
joinColumns = {@JoinColumn(name = "tid",updatable = false)},
inverseJoinColumns = {@JoinColumn(name="sid",updatable = false)}
)
public Set<Students> getStus() {
return stus;
}

在Teachers.java类中上面的注解即可满足单向多对多开发;

***********双向多对多

Students.java

    private Set<Teachers> teachers = new HashSet<>() ;
@ManyToMany(cascade = CascadeType.ALL,fetch = FetchType.LAZY)
@JoinTable(
name = "stu_teach",
joinColumns = {@JoinColumn(name = "sid",updatable = false)},//该实体对应表的主键
inverseJoinColumns = {@JoinColumn(name="tid",updatable = false)}
)
public Set<Teachers> getTeachers() {
return teachers;
}

Teacher.java

 private Set<Students> stus = new HashSet<>();
@ManyToMany(cascade = CascadeType.MERGE,fetch = FetchType.LAZY)
@JoinTable(
name = "stu_teach",
joinColumns = {@JoinColumn(name = "tid",updatable = false)},//该实体对应表的主键
inverseJoinColumns = {@JoinColumn(name="sid",updatable = false)}
)
public Set<Students> getStus() {
return stus;
}

总结:

真的很操蛋啊,比mybatis要难学多了,各种bug,哎

Hibernate注解开发详解的更多相关文章

  1. Spring MVC 注解开发详解

    @Controller控制器定义 1.Controller是单利模式,被多个线程请求共享,因此设计成无序状态. 2.通过@controller标注即可将class定义为一个controller类.为使 ...

  2. hibernate enum映射详解

    hibernate enum映射详解 在这里介绍注解的形式,如果想要了解XML配置的方式,可以自行查找相关资料. 例如以下Entity @Entity @Table(name = "t_us ...

  3. (转)Hibernate的配置详解

    http://blog.csdn.net/yerenyuan_pku/article/details/65041077 在<Hibernate快速入门>一文中,我有讲到Hibernate的 ...

  4. EasyPR--开发详解(6)SVM开发详解

    在前面的几篇文章中,我们介绍了EasyPR中车牌定位模块的相关内容.本文开始分析车牌定位模块后续步骤的车牌判断模块.车牌判断模块是EasyPR中的基于机器学习模型的一个模块,这个模型就是作者前文中从机 ...

  5. 基于H5的微信支付开发详解

    这次总结一下用户在微信内打开网页时,可以调用微信支付完成下单功能的模块开发,也就是在微信内的H5页面通过jsApi接口实现支付功能.当然了,微信官网上的微信支付开发文档也讲解的很详细,并且有实现代码可 ...

  6. ****基于H5的微信支付开发详解[转]

    这次总结一下用户在微信内打开网页时,可以调用微信支付完成下单功能的模块开发,也就是在微信内的H5页面通过jsApi接口实现支付功能.当然了,微信官网上的微信支付开发文档也讲解的很详细,并且有实现代码可 ...

  7. 【转发】NPAPI开发详解,Windows版

    NPAPI开发详解,Windows版 9 jiaofeng601, +479 9人支持,来自Meteor.猪爪.hanyuxinting更多 .是非黑白 .Yuan Xulei.hyolin.Andy ...

  8. 热烈祝贺华清远见《ARM处理器开发详解》第2版正式出版

    2014年6月,由华清远见研发中心组织多名业 内顶尖讲师编写的<ARM处理器开发详解>一书正式出版.本书以S5PV210处理器为平台,详细介绍了嵌入式系统开发的各个主要环节,并注重实践,辅 ...

  9. 嵌入式Linux应用程序开发详解------(创建守护进程)

    嵌入式Linux应用程序开发详解 华清远见 本文只是阅读文摘. 创建一个守护进程的步骤: 1.创建一个子进程,然后退出父进程: 2.在子进程中使用创建新会话---setsid(): 3.改变当前工作目 ...

随机推荐

  1. 介绍C语言指针

    最近心态不太好,但是还是控制自己刷一下算法题,但是看着多次出现的 “Segmentation fault”,心态又爆炸啦.我只想说:“我也早觉得有写一点东西的必要了.离三月十八日也已有两星期,忘却的救 ...

  2. Oracle查询优化改写--------------------操作多个表

    一.union all与空字符串 二.组合相关行 三.in .exists.inter join .left join .right join .full join 之间的区别 'inner  joi ...

  3. 详谈C++虚函数表那回事(一般继承关系)

    沿途总是会出现关于C++虚函数表的问题,今天做一总结: 1.什么是虚函数表: 虚函数(Virtual Function)是通过一张虚函数表(Virtual Table)来实现的.简称为V-Table. ...

  4. 团队作业4——第一次项目冲刺(Alpha版本)

    第一天http://www.cnblogs.com/ThinkAlone/p/7861070.html 第二天http://www.cnblogs.com/ThinkAlone/p/7861191.h ...

  5. java克隆之深拷贝与浅拷贝

    版权声明:本文出自汪磊的博客,转载请务必注明出处. Java深拷贝与浅拷贝实际项目中用的不多,但是对于理解Java中值传递,引用传递十分重要,同时个人认为对于理解内存模型也有帮助,况且面试中也是经常问 ...

  6. 浅谈 ThreadLocal

    有时,你希望将每个线程数据(如用户ID)与线程关联起来.尽管可以使用局部变量来完成此任务,但只能在本地变量存在时才这样做.也可以使用一个实例属性来保存这些数据,但是这样就必须处理线程同步问题.幸运的是 ...

  7. prop attr 到底哪里不一样?

    好吧 首先承认错误  说好的每天进行一次只是总结  但是我没坚持住 准确的来说 我并没有每天会学到了东西 但是 我一直在持续努力着  以后应该不会每天都写  但是自己觉得有用的  或者想加强记忆的 可 ...

  8. Angular组件——父组件调用子组件方法

    viewChild装饰器. 父组件的模版和控制器里调用子组件的API. 1.创建一个子组件child1里面只有一个greeting方法供父组件调用. import { Component, OnIni ...

  9. JavaScript 原型中的哲学思想

    学习JavaScript过程中,原型问题一直让我疑惑许久,那时候捧着那本著名的红皮书,看到有关原型的讲解时,总是心存疑虑.当在JavaScript世界中走过不少旅程之后,再次萌发起研究这部分知识的欲望 ...

  10. 【原创】公司各个阶段 CTO 需要做什么?(上篇)

    CTO 是企业内技术最高负责人,对企业的发展起到至关重要的作用.但随着公司的不断发展,CTO 的工作重心也会不断变化.只有在正确的阶段做正确的事,才能更好地为公司做出贡献.我是空中金融 CTO ,TG ...