欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Hibernate 基于set的双向关联

程序员文章站 2022-04-22 19:40:28
...

继续上一节,上一节我们建立了person-event的一对多关联,要在此基础上建立他们的多对多关联只需在event端建立一个

event-person的一对多关联即可。所以我们只需改动Event.java和映射文件event.hbm.xml

 

Event.java

 

 

package com.hb.jo;

import java.util.Date;
import java.util.HashSet;
import java.util.Set;

public class Event {

	private long id;
	private String title;
	private Date date;
	
	private Set<Person> persons = new HashSet<Person>();

	public Set<Person> getPersons() {
		return persons;
	}

	public void setPersons(Set<Person> persons) {
		this.persons = persons;
	}

	//因为hibernate通过java的反射机制创建对象,所以必须提供无参的构造
	public Event()
	{
		
	}
	
	public long getId() {
		return id;
	}

	public void setId(long id) {
		this.id = id;
	}

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}


	public Date getDate() {
		return date;
	}

	public void setDate(Date date) {
		this.date = date;
	}
}	
	

 

 

event.hbm.xml

 

 

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
	<class name="com.hb.jo.Event" table="Events">
		<id name="id" column="event_id">
			<generator class="native"></generator>
		</id>
		<property name="date" type="timestamp" column="Date"></property>
		<property name="title" column="Title"></property>
		<set name="persons" table="Person_Events" inverse="true">
			<key column="event_id"></key>
			<many-to-many column="person_id" class="com.hb.jo.Person"></many-to-many>
		</set>
	</class>
</hibernate-mapping>

 

 

关于inverse = 'true'的解释:

hibernate api 写道
对于你和Java来说,一个双向关联仅仅是在两端简单地正确设置引用。然而,Hibernate并没有足够的信息去正确地执行INSERT和UPDATE语句(以避免违反数据库约束),所以它需要一些帮助来正确的处理双向关联。把关联的一端设置为inverse将告诉Hibernate忽略关联的这一端,把这端看成是另外一端的一个镜象(mirror)。这就是所需的全部信息,Hibernate利用这些信息来处理把一个有向导航模型转移到数据库schema时的所有问题。你只需要记住这个直观的规则:所有的双向关联需要有一端被设置为inverse。在一对多关联中它必须是代表多(many)的那端。而在多对多(many-to-many)关联中,你可以任意选取一端,因为两端之间并没有差别。