注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。

接下来讲解多对多双向注解:

我以用户和房子作为示例讲解。

第一步:准备实体类

House(房间表)

package cn.manytomany.entity;

import javax.persistence.*;
import java.util.HashSet;
import java.util.Set; /**
* Created by accp on 2017/2/10.
*/
@Entity
@Table(name = "House")
public class House {
@Id
@GeneratedValue
private Integer id;
@Column
private String title;
@Column
private String description;
@Column
private Integer price;
@Column
private String pubdate;
@Column
private Integer floorage;
@Column
private String contact;
@Column
private Integer userid;
@Column
private Integer streetid;
@Column
private Integer typeid; /**
* 将控制权交给主表
*/
@ManyToMany(mappedBy = "houses")
private Set<Users> userss=new HashSet<Users>(); public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getTitle() {
return title;
} public void setTitle(String title) {
this.title = title;
} public String getDescription() {
return description;
} public void setDescription(String description) {
this.description = description;
} public Integer getPrice() {
return price;
} public void setPrice(Integer price) {
this.price = price;
} public String getPubdate() {
return pubdate;
} public void setPubdate(String pubdate) {
this.pubdate = pubdate;
} public Integer getFloorage() {
return floorage;
} public void setFloorage(Integer floorage) {
this.floorage = floorage;
} public String getContact() {
return contact;
} public void setContact(String contact) {
this.contact = contact;
} public Integer getUserid() {
return userid;
} public void setUserid(Integer userid) {
this.userid = userid;
} public Integer getStreetid() {
return streetid;
} public void setStreetid(Integer streetid) {
this.streetid = streetid;
} public Integer getTypeid() {
return typeid;
} public void setTypeid(Integer typeid) {
this.typeid = typeid;
} public Set<Users> getUserss() {
return userss;
} public void setUserss(Set<Users> userss) {
this.userss = userss;
}
}

User(用户表):

package cn.manytomany.entity;

import javax.persistence.*;
import java.util.HashSet;
import java.util.Set; /**
* Created by accp on 2017/2/10.
*/
@Entity
@Table(name = "Users")
public class Users {
@Id
@GeneratedValue
private Integer id;
@Column
private String name;
@Column
private String password;
@Column
private String telephone;
@Column
private String username;
@Column
private String isadmin;
/**
* 以房间表作为主导 设置级联
* 只需要保存用户 即可保存房间
*/
@ManyToMany(cascade = {CascadeType.ALL})
@JoinTable(
name = "RUHS",
joinColumns =@JoinColumn(name = "RUID"),
inverseJoinColumns = @JoinColumn(name = "RHID")
)
private Set<House> houses=new HashSet<House>(); 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 getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
} public String getTelephone() {
return telephone;
} public void setTelephone(String telephone) {
this.telephone = telephone;
} public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public String getIsadmin() {
return isadmin;
} public void setIsadmin(String isadmin) {
this.isadmin = isadmin;
} public Set<House> getHouses() {
return houses;
} public void setHouses(Set<House> houses) {
this.houses = houses;
}
}

第二步:在hibernate.cfg.xml文件中配置<mapping>节点

<mapping class="cn.manytomany.entity.House"/>
<mapping class="cn.manytomany.entity.Users"/>

第三步:书写测试类

package cn.manytomany.test;

import cn.manytomany.entity.House;
import cn.manytomany.entity.Users;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.After;
import org.junit.Before;
import org.junit.Test; /**
* Created by accp on 2017/2/10.
*/
public class DemoTest {
Configuration cfg;
Session session;
Transaction tx;
@Before
public void myBefore(){
cfg=new Configuration().configure();
SessionFactory factory = cfg.buildSessionFactory();
session = factory.openSession();
tx=session.beginTransaction();
}
@After
public void myAfter(){
tx.commit();
session.close();
}
@Test
public void add(){ Users users1=new Users();
users1.setName("hiber1");
users1.setPassword("");
users1.setTelephone("");
users1.setUsername("Jim");
users1.setIsadmin(""); Users users2=new Users();
users2.setName("hiber2");
users2.setPassword("");
users2.setTelephone("");
users2.setUsername("Jim2");
users2.setIsadmin(""); House house=new House();
house.setTitle("元宵佳节房屋便宜");
house.setDescription("经济实惠,元宵佳宿!");
house.setPrice();
house.setPubdate("2017-02-11");
house.setFloorage();
house.setContact("圆圆");
house.setStreetid();
house.setTypeid(); House house2=new House();
house2.setTitle("共度元宵");
house2.setDescription("便宜喽,赶快下手!");
house2.setPrice();
house2.setPubdate("2017-01-10");
house2.setFloorage();
house2.setContact("佳佳");
house2.setStreetid();
house2.setTypeid(); /*关联关系
* 同一个房间对应不同的用户
*
* 同一个用户对应不同的房间
* */
users1.getHouses().add(house);
users1.getHouses().add(house2);
users2.getHouses().add(house2); session.save(users1);
session.save(users2);
}
}

在配置多对多时要选取那张表生成第三张表非常重要,在第三张表的外键也要搞清楚。

Hibernate 注解(Annotations 四)多对多双向注解的更多相关文章

  1. Hibernate 注解 (Annotations 三)多对一双向注解

    注解(Annotation),也叫元数据.一种代码级别的说明.它是JDK1.5及以后版本引入的一个特性,与类.接口.枚举是在同一个层次.它可以声明在包.类.字段.方法.局部变量.方法参数等的前面,用来 ...

  2. Java进阶知识10 Hibernate一对多_多对一双向关联(Annotation+XML实现)

    本文知识点(目录): 1.Annotation 注解版(只是测试建表)    2.XML版 的实现(只是测试建表)    3.附录(Annotation 注解版CRUD操作)[注解版有个问题:插入值时 ...

  3. Hibernate(十一)多对多双向关联映射

    上次我们在中Hibernate从入门到精通(十)多对多单向关联映射讲解了一下多对多单向关联映射,这次我 们讲解一下七种映射中的最后一种多对多双向关联映射. 多对多双向关联映射 按照我们之前的惯例,先看 ...

  4. Hibernate 注解(Annotations 二)一对一双向注解

    注解(Annotation),也叫元数据.一种代码级别的说明.它是JDK1.5及以后版本引入的一个特性,与类.接口.枚举是在同一个层次.它可以声明在包.类.字段.方法.局部变量.方法参数等的前面,用来 ...

  5. hibernate 映射<四>多对一双向映射

    学生和班级的例子来说,多个学生可以对应一个班级. 1.站在学生角度来说,学生就是多端.那么我们可以通过多对一来维护2者的关系. 2.站在班级的角度来说,班级就是一端.那么我们可以通过一对多啦维护2者的 ...

  6. hibernate之实体@onetomany和@manytoone双向注解(转)

    下面是User类: @onetomany @Entity @Table(name="user") public class User implements Serializable ...

  7. Java进阶知识12 Hibernate多对多双向关联(Annotation+XML实现)

    1.Annotation 注解版 1.1.应用场景(Student-Teacher):当学生知道有哪些老师教,老师也知道自己教哪些学生时,可用双向关联 1.2.创建Teacher类和Student类 ...

  8. Hibernate—— 一对多 和 多对多关联关系映射(xml和注解)总结(转载)

    One to Many 映射关系 多对一单向外键关联(XML/Annotation) 一对多单向外键关联(XML/Annotation) 懒加载和积极加载 一对多双向外键关联(XML/Annotati ...

  9. hibernate one-to-many many-to-one 双向注解

    建表语句: DROP TABLE IF EXISTS `t_company`; CREATE TABLE `t_company` ( `companyId` ) unsigned NOT NULL A ...

随机推荐

  1. [Swift实际操作]七、常见概念-(13)使用UIScreen查询设备屏幕信息

    本文将为你演示,如何获得设备的屏幕信息,了解设备的屏幕尺寸等信息,才能做出适配性更好的应用程序. 首先导入需要使用到的界面工具框架 import UIKit 然后通过UIScreen类,就可以获得设备 ...

  2. Linux 中使用 virsh 管理 KVM 虚拟机 (转)

    术语 虚拟化指的是:在相同的物理(硬件)系统上,同时运行多个操作系统,且这几个系统相互隔离的可能性,而那个硬件在虚拟化架构中被称作宿主机(host).虚拟机监视器(也被称为虚拟机管理程序(hyperv ...

  3. redhat基本操作

     实验:安装redhat   需求:使用DVD镜像文件rhel-server-6.5-x86_64-dvd.iso,在虚拟机中安装RHEL 6系统 分区方案选择“使用所有空间”. 软件组选择“基本服务 ...

  4. 多线程:GCD

    多线程是程序开发中非常基础的一个概念,大家在开发过程中应该或多或少用过相关的东西.同时这恰恰又是一个比较棘手的概念,一切跟多线程挂钩的东西都会变得复杂.如果使用过程中对多线程不够熟悉,很可能会埋下一些 ...

  5. Spark构成

    RDD Spark基本的数据结构叫弹性分布式数据集(Resilient Distributed Datasets,简称RDD). 概念: 一个分布于集群节点的只读数据集合,并以容错的.并行的方式进行维 ...

  6. Sublime Text 3安装插件(Mac 10.12)

    1.先安装Package Control,默认这个是没有安装的. 使用[control + -]打开控制台,输入以下代码: import urllib.request,os; pf = 'Packag ...

  7. nodejs(四) --- cluster模块详解

    什么是cluster模块,为什么需要cluster模块?  cluster在英文中有集.群的意思. nodejs默认是单进程的,但是对于多核的cpu来说, 单进程显然没有充分利用cpu,所以,node ...

  8. jquery的animate关于background-position属性

    jQuery 的 animate 虽然能直接使用 CSS 的方式来进行动画,但有些属性其实是不支持的,例如:background-position. 谷歌支持 background-position- ...

  9. smarty 教程 及 常用点

    1. 简单例子 有助回忆基本知识点 define("DIR",dirname(__FILE__)); require_once(DIR."/libs/Smarty.cla ...

  10. TestNG学习地址分享

    谨以此随笔来记录一个曾经学习TestNG的网站,供以后作为工具书查阅. 链接地址,点击此处.