【第21期】观点:人工智能到底用 GPU?还是用 FPGA?

如何利用Hibernate4的annotation配置多对多(ManyToMany)关系?

原创 2013年12月05日 15:42:14

首先,来看看ER关系图:


这个关系可以理解为:一个角色可以有多个雇员,而一个雇员也可以有多个角色。现实中就是老板->经理->一般员工。

然后,再来看看表结构:

CREATE TABLE employee
(
  id integer NOT NULL,
  first_name character varying(60),
  last_name character varying(60),
  full_name character varying(120),
  email character varying(255),
  cell_phone character varying(15),
  age smallint,
  sex smallint,
  department_id integer,
  CONSTRAINT employee_pk PRIMARY KEY (id)
)

CREATE TABLE role
(
  id integer NOT NULL,
  name character varying(60),
  rank integer,
  CONSTRAINT role_pk PRIMARY KEY (id)
)

CREATE TABLE employee_role
(
  employee_id integer NOT NULL,
  role_id integer NOT NULL,
  CONSTRAINT employee_role_pk PRIMARY KEY (employee_id, role_id),
  CONSTRAINT fk_employee_role_1 FOREIGN KEY (employee_id)
      REFERENCES employee (id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT fk_employee_role_2 FOREIGN KEY (role_id)
      REFERENCES role (id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
)

其中需要说明的是中间表(也就是大多数说的关系表)的组合主键,这个必须设置,否则你会发现只有一个表被插入了数据,而中间表没有。

最后,来看看entity类中的annotation是如何设置的:

首先是Employee类

@ManyToMany(cascade = {CascadeType.ALL}, fetch = FetchType.LAZY)
@JoinTable(name = "employee_role", 
	   joinColumns = {@JoinColumn(name = "employee_id")}, 
	   inverseJoinColumns = {@JoinColumn(name = "role_id")})
private Set<Role> roles = new LinkedHashSet<Role>();

接着是Role类

@ManyToMany(mappedBy = "roles")
private Set<Employee> employees = new LinkedHashSet<Employee>();

需要说明的是:

  1. joinColumns设置的是employee->employee_role的映射关系;
  2. inverseJoinColumns设置的是employee_role->role的映射关系;
  3. Role类中的mappedBy="roles"说明由Role类来维护Employee_Role关系。
你可以用以下测试代码:
public class HibernateTest {

	private static SessionFactory sf;
	
	@BeforeClass
	public static void setUpBeforeClass() throws Exception {
		Configuration cfg = new Configuration();
		cfg.configure();
		ServiceRegistry sr = new ServiceRegistryBuilder().applySettings(cfg.getProperties()).buildServiceRegistry();
		try {
			sf = cfg.configure()
					.addAnnotatedClass(Employee.class)
					.buildSessionFactory(sr);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	@Test
	public void test() {
		Session s = sf.openSession();
		Transaction tx = s.beginTransaction();
		
		Department d = new Department();
		d.setName("development");
		
		Role r = new Role();
		r.setName("administrator");
		r.setRank(1);
		
		Role r1 = new Role();
		r1.setName("owner");
		r1.setRank(2);
		
		Employee e = new Employee();
		e.setAge(33);
		e.setSex(1);
		e.setCellphone("86186xxxxxxx8");
		e.setLastname("Tian");
		e.setFirstname("Max");
		e.setEmail("max.tian@xxx.com");
		e.setDepartment(d);
		
		Employee e1 = new Employee();
		e1.setAge(33);
		e1.setSex(1);
		e1.setCellphone("86186xxxxxxx8");
		e1.setLastname("Tom");
		e1.setFirstname("Jackson");
		e1.setEmail("tom.jackson@xxx.com");
		e1.setDepartment(d);
		
		e.getRoles().add(r);
		e.getRoles().add(r1);
		e1.getRoles().add(r);
		
		s.save(e1);
		s.save(e);
		s.persist(d);
		
		tx.commit();
		s.close();
		
	}
}


版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

关系/对象映射 多对多关系(@ManyToMany 注释)【重新认识】

查了好多资料 old: @ManyToMany 注释:表示此类是多对多关系的一边,mappedBy 属性定义了此类为双向关系的维护端,注意:mappedBy 属性的值为此关系的另一端的属性名。 ...

@ManyToMany(多对多数据映射的insert、update及delete)

对hibernete只知道皮毛的偶,一直觉得在多表联合查询时配置hibernate数据表的映射文件很是麻烦的问题,最近难得有时间学习java annotation所以顺便更进一步的去学习一下hiber...

hibernate多对多关系查询

用户sys_userinfo和角色sys_role,典型的多对多关系, 用户表:sys_userinfo 角色表:sys_role 关联表:rel_user_role 用户sysUserInfo:...

hibernate关系映射--单向多对多@ManyToMany

1.单向多对多关联必须使用连接表,它和有链接表的单向一对多很相似 2.主要代码@ManyToMany(cascade={CascadeType.ALL}) @JoinTable(name="T_J...
  • muyeju
  • muyeju
  • 2015-08-23 15:22
  • 1272

Hibernate关系映射(七)多对多双向关联@ManyToMany Annotation方式

本篇介绍多对多的双向关联,也是Hibernate关系映射的结尾篇,后续篇章会介绍Hibernate的懒加载机制和级联相关操作。首先还是来模拟一个实际应用的场景,在之前开发过的RBAC模型中,有这样一个...

hibernate关系映射--双向多对多@ManyToMany

1.双向多对多也只能采用连接表的形式建立两个实体的关联关系 2.双向多对多关系两段都需要使用@ManyToMany,@JoinTable。如果希望某一端放弃控制关联关系,则要用mappedBy属性,...

HQL实现多对多关联查询(无关系表的映射)

HQL实现多对多关联查询(无关系表的映射) 目录: 应用场景演示 [一]、应用场景 在用注解的方式(@ManyToMany @JoinTable)实现多对多映射时,并没有具体的多对多关系表...

ManyToMany(基于注解)使用之进阶(中级版)

社团和成员就是多对多的关系,一个成员有多个社团,一个社团也有多个成员,这里的多对多映射采用中间表连接的映射策略,建立中间表的映射策略,建立中间表分别引入俩边的主键作为外键。通过中间表映射俩个表之间的关...

Hibernate中manytomany实例二(多对多单向)

1:User类:public class User {   private int id; private String name; private Set roles;  public Set ge...

关系/对象映射 多对多关系(@ManyToMany 注释)【重新认识】

查了好多资料old:@ManyToMany 注释:表示此类是多对多关系的一边,mappedBy 属性定义了此类为双向关系的维护端,注意:mappedBy 属性的值为此关系的另一端的属性名。例如,在St...
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)