Hibernate的注解方式:多对多双向关系基于外键关联
来源:互联网 发布:unix环境高级编程mobi 编辑:程序博客网 时间:2024/05/18 03:56
我们将创建两个pojo类,User和Lesson类,还有一个测试类Test,以及Usert对应的数据库表user表,Lesson对应的数据库表lesson表,还有两个数据库表对应的桥表user_and_lesson表(起一个连接的作用),桥表中分别有两个外键,对应于User表和Lesson表的主键id。
//User类import java.util.HashSet;import java.util.Set;import javax.persistence.CascadeType;import javax.persistence.Entity;import javax.persistence.Id;import javax.persistence.JoinColumn;import javax.persistence.JoinTable;import javax.persistence.ManyToMany;import javax.persistence.Table;@Entity //说明该类为一个实体bean@Table(name="user") //说明该类映射的表(若类名和表名一样,则可以不写name属性(忽略大小写))public class User {private Integer id;private String name;private Set<Lesson> lessons = new HashSet<Lesson>();public User() {}public User(Integer id, String name, Set<Lesson> lessons) {this.id = id;this.name = name;this.lessons = lessons;}@Id //声明idpublic 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;}//声明多对多关系,下面的注解也可以写在另一个类中,相应的另一个类中的注解就要写在这个类中@ManyToMany(cascade=CascadeType.ALL) //cascade说明所有级联,就是和这个类对应表有关的操作所关联的数据都会被相应的操作所影响(牵一发而动全身)@JoinTable(name="lesson_and_user",joinColumns={@JoinColumn(name="user_id")},inverseJoinColumns={@JoinColumn(name="lesson_id")})//JoinTable注解的name属性的值lesson_and_user为user表和lesson表的桥表,user_id为桥表对应user表的外键,lesson_id为桥表对应lesson表的外键public Set<Lesson> getLessons() {return lessons;}public void setLessons(Set<Lesson> lessons) {this.lessons = lessons;}@Overridepublic String toString() {return "User [id=" + id + ", name=" + name + ", lessons=" + lessons + "]";}}
//Lesson类import java.util.HashSet;import java.util.Set;import javax.persistence.Entity;import javax.persistence.Id;import javax.persistence.ManyToMany;import javax.persistence.Table;@Entity@Table(name="lesson")public class Lesson {private Integer id;private String name;private Set<User> users = new HashSet<User>();public Lesson(){}public Lesson(Integer id, String name, Set<User> users) {this.id = id;this.name = name;this.users = users;}@Idpublic 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;}@ManyToMany(mappedBy="lessons") //lessons为另一类User类中的lessons属性public Set<User> getUsers() {return users;}public void setUsers(Set<User> users) {this.users = users;}@Overridepublic String toString() {return "Lesson [id=" + id + ", name=" + name + "]";}}
user表
create table user( id int(11) primary key, name varchar(20) not null );
lesson表
create table user( id int(11) primary key, name varchar(20) not null );
桥表user_and_lesson
create table user( id int(11) primary key, name varchar(20) not null );
<mapping class="com.liukun.association.many2many.pojo.User"/>
<mapping class="com.liukun.association.many2many.pojo.Lesson"/>
即通知Hibernate映射的pojo类。
//Test测试类import org.hibernate.Session;import org.hibernate.Transaction;import com.liukun.association.many2many.pojo.Lesson;import com.liukun.association.many2many.pojo.User;import com.liukun.common.HibernateSessionFactory;public class Test {public static void main(String[] args) {User u1 = new User();u1.setId(1);u1.setName("张三");User u2 = new User();u2.setId(2);u2.setName("李四");Lesson le1 = new Lesson();le1.setId(1);le1.setName("数据结构");Lesson le2 = new Lesson();le2.setId(2);le2.setName("JAVA课");u1.getLessons().add(le1);u1.getLessons().add(le2);u2.getLessons().add(le1);u2.getLessons().add(le2);le1.getUsers().add(u1);le1.getUsers().add(u2);le2.getUsers().add(u1);le2.getUsers().add(u2);Transaction trans = null;try{//这里HibernateSessionFactory.getSession()是我自己封装的获取Session的方法,你可以自己写Session session = HibernateSessionFactory.getSession();trans = session.beginTransaction();//User u = (User)session.get(User.class, 1);//System.out.println(u.getName()+":"+u.getLessons());session.save(u1);session.save(u2);trans.commit();}catch(Exception ex){ex.printStackTrace();trans.rollback();}}}
//HibernateSessionFactory类import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;import org.hibernate.service.ServiceRegistry;import org.hibernate.service.ServiceRegistryBuilder;public class HibernateSessionFactory {public static Configuration config; public static SessionFactory factory;static{config= new Configuration().configure();ServiceRegistryBuilder builder = new ServiceRegistryBuilder();builder.applySettings(config.getProperties());ServiceRegistry serviceRegistry = builder.buildServiceRegistry();factory = config.buildSessionFactory(serviceRegistry);}public static Session getSession(){//获得当前线程所绑定的session对象Session session = factory.getCurrentSession();return session;}}
这样我们就实现了hibernate注解的多对多双向关联关系。多对多无非就是在两个对应的类中添加一个对方类的集合,可以使set,list,map等。单向的多对多只是把一方的类中的对方类的集合属性去掉就行。
阅读全文
0 0
- Hibernate的注解方式:多对多双向关系基于外键关联
- hibernate:基于注解一对多双向关联关系外键方式
- Hibernate关系映射级别注解(多对多单向外键关联、多对多双向外键关联)
- hibernate注解方式双向一对多关联
- Hibernate关联关系配置-----基于连接表的双向一对多/多对一映射配置
- Hibernate关联关系配置-----基于连接表的双向多对多配置
- Hibernate关联关系配置-----基于连接表的双向多对多配置
- 基于注解的Hibernate中多对多关联关系的示例
- Hibernate关系映射级别注解(一对多单向外键关联、一对多(多对一)双向外键关联)
- hibernate基于连接表的多对多双向关联
- Hibernate注解多对一关联关系
- Hibernate双向多对多 注解方式
- Hibernate 基于注解的方式 实现的关系映射案例(一对一关系,一对多关系,多对多关系)
- Hibernate -- 一对多的双向关联关系
- Hibernate关系映射(七)多对多双向关联@ManyToMany Annotation方式
- hibernate使用注解的方式进行多对一关联
- Hibernate关系映射(11)_多对多双向关联
- Hibernate -- 映射多对多双向关联关系
- Android获取所有应用的资源id和对应的uri
- Android打包
- websocket搭建网页端聊天室
- FastJSON
- Android图片加载框架Glide用法
- Hibernate的注解方式:多对多双向关系基于外键关联
- redis使用之利用jedis实现redis消息队列
- win10下vs2015配置Opencv3.3.1过程详解
- 对于数组指针—指针数组;函数指针—函数指针数组,指向函数指针数组的指针,的理解
- 读懂Hinton的提出的Capsulet架构并用TensorFlow实现
- Android 各种加密
- 热部署原理解析
- 对contentView的点击事件的理解
- 总裁、董事长、CEO有什么区别?