zoukankan      html  css  js  c++  java
  • Hibernate一对多、多对一关联

    一对多、多对一关联:在多方加外键

    示例:Group(一方)和User(多方),一个Group可以有多个User,每个User只能属于一个Group

    多对一单向关联

    在User(多方)中建Group(一方)对象,并添加@ManyToOne注解

    1.建Group实体类和User实体类,添加Annotation注解,如下

    @Entity
    @Table(name="_group")    //group在MySQL中是关键字,不能直接做表名
    public class Group {
    	private int id;
    	private String name;
    	@Id
    	@GeneratedValue
    	public int getId() {
    		return id;
    	}
    	public void setId(int id) {
    		this.id = id;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    }
    @Entity
    @Table(name="_user")      //为了和表_group保持一致,也用一个别名
    public class User {
    	private int id;
    	private String name;
    
    	private Group group;
    
    	@Id
    	@GeneratedValue
    	public int getId() {
    		return id;
    	}
    	public void setId(int id) {
    		this.id = id;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    
    	@ManyToOne       //多对一关联
    //	@JoinColumn(name="groupId")    //任意指定生成的外键名
    	public Group getGroup() {
    		return group;
    	}
    	public void setGroup(Group group) {
    		this.group = group;
    	}	
    }

    2.在hibernate.cfg.xml中添加mapping语句

    <mapping class="com.hibernate.model.Group"/>
    <mapping class="com.hibernate.model.User"/>

    3.建Junit测试类

    public class ORMappingTest {
    	
    	@Test
    	public void test() {	
    		new SchemaExport(new Configuration().configure()).create(true, true);		
    	}
    }

    程序至此结束,运行程序,在数据库中生成表_group和表_user,并在控制台输出建表语句。

    _user表中会自动生成属性名为group_id的外键,可用@JoinColumn注解修改其属性名

    一对多单向关联

    在Group(一方)中建User(多方)对象,此对象采用Set集合形式

    并添加@ManyToOne和@JoinColumn注解(必须添加)

    1.建Group实体类和User实体类,添加Annotation注解,如下

    @Entity
    @Table(name="_group")    //group在MySQL中是关键字,不能直接做表名
    public class Group {
    	private int id;
    	private String name;
    	
    	private Set<User> users = new HashSet<User>();   //新建Set集合形式的多方对象users
    	
    	@Id
    	@GeneratedValue
    	public int getId() {
    		return id;
    	}
    	public void setId(int id) {
    		this.id = id;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	
    	@OneToMany        //一对多关联
    	@JoinColumn(name="groupId")       //若不添加该属性,则会在数据库中生成三张表。
    	public Set<User> getUsers() {
    		return users;
    	}
    	public void setUsers(Set<User> users) {
    		this.users = users;
    	}
    }
    @Entity
    @Table(name="_user")      //为了和表_group保持一致,也用一个别名
    public class User {
    	private int id;
    	private String name;
    
    	@Id
    	@GeneratedValue
    	public int getId() {
    		return id;
    	}
    	public void setId(int id) {
    		this.id = id;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    }

    2.在hibernate.cfg.xml中添加mapping语句----同上

    3.建Junit测试类----同上

    程序至此结束,运行程序,会在数据库中生成表_group和表_user,并在控制台输出建表语句

    _user表中会生成指定属性名的外键

    一对多、多对一双向关联

    在User中建Group对象,并添加@ManyToOne注解;在Group中建User对象,并添加@OneToMany注解

    1.建Group实体类和User实体类,添加Annotation注解

    User类同“多对一单向关联”部分的User类

    Group类,如下:

    @Entity
    @Table(name="_group")    //group在MySQL中是关键字,不能直接做表名
    public class Group {
    	private int id;
    	private String name;
    	
    	private Set<User> users = new HashSet<User>();
    	
    	@Id
    	@GeneratedValue
    	public int getId() {
    		return id;
    	}
    	public void setId(int id) {
    		this.id = id;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	
    	@OneToMany(mappedBy="group")   //这里的"group"是指User类中的private Group group;
    	public Set<User> getUsers() {
    		return users;
    	}
    	public void setUsers(Set<User> users) {
    		this.users = users;
    	}
    }

    2.在hibernate.cfg.xml中添加mapping语句----同上

    3.建Junit测试类----同上

    程序至此结束,

    运行程序,会在数据库中生成表_group和表_user,并在控制台输出建表语句

    _user表中会自动生成属性名为group_id的外键,可用@JoinColumn注解修改其属性名

    @mappedBy含义

    1.单向关系不需要设置该属性,双向关系必须设置,避免双方都建立外键字段

    2.只有OneToOne,OneToMany,ManyToMany上才有mappedBy属性,ManyToOne不存在该属性

    3.mappedBy跟JoinColumn/JoinTable总是处于互斥的一方

    以Group(一方)和User(多方)为例,

    外键在User(多方),@JoinColumn/@JoinTable则只能设置在User(多方)。

    则@mappedBy设置在Group(一方)。表明此关联关系是由User(多方)维护的。

  • 相关阅读:
    服务器磁盘脱机无法挂载
    go 字符串操作相关
    golang 系列:atomic 原子操作
    UUID简介及 Golang实现
    go 图片base64转二进制
    golang go 中字符串和各种int类型之间的相互转换方式
    Go 获取当前时间 时间格式的转换 秒、毫秒、纳秒时间戳输出
    Go语言中调用C语言类型转换篇
    Supervisor 部署go gin服务 或在Linux下面独立部署
    Go语言对字符串进行SHA1 哈希运算的方法
  • 原文地址:https://www.cnblogs.com/weilunhui/p/3897791.html
Copyright © 2011-2022 走看看