一対多(多対一)双方向関連(annotation&xml)

4654 ワード

annotation方式:
一、一方のクラスを編纂する

@Entity
public class Group {
	private int id;
	private String name;
	private Set<User> users =new HashSet<User>();
	@Id
	@GeneratedValue
	public int getId() {
		return id;
	}
	@OneToMany(mappedBy="group")
	public Set<User> getUsers() {
		return users;
	}
	public void setUsers(Set<User> users) {
		this.users = users;
	}
	public String getName() {
		return name;
	}
	public void setId(int id) {
		this.id = id;
	}
	public void setName(String name) {
		this.name = name;
	}
}

このクラスに対して@OneToMany(mappedBy="group")は,mappedByが相手である多方面の属性(自分の属性ではない)を設定することを主導する.
二、多方面のクラスを編纂する

@Entity
public class User {
	private int id;
	private String name;
	private Group group;

	@Id
	@GeneratedValue
	public int getId() {
		return id;
	}
	@ManyToOne
	public Group getGroup() {
		return group;
	}
	public String getName() {
		return name;
	}
	public void setGroup(Group group) {
		this.group = group;
	}
	public void setId(int id) {
		this.id = id;
	}
	public void setName(String name) {
		this.name = name;
	}
}

本クラスについて@ManyToOne
三、hibernateを設定する.cfg.xml

<mapping class="org.hibernate.tutorial.domain.Group"/>
		<mapping class="org.hibernate.tutorial.domain.User"/>

四、テスト結果

    create table Group (
        group_Id integer not null auto_increment,
        name varchar(255),
        primary key (group_Id)
    )

    create table User (
        User_ID integer not null auto_increment,
        name varchar(255),
        groupID integer,
        primary key (User_ID)
    )

    alter table User 
        add index FK_k6brud1jwhinw4g4f6yafcqjm (groupID), 
        add constraint FK_k6brud1jwhinw4g4f6yafcqjm 
        foreign key (groupID) 
        references Group (group_Id)

注意:双方向にmappedbyを設定し、冗長フィールドを減らし、相手の属性を主導する必要があります.
xml方式:
一、上記の二つの実体クラスを作成する
二、一方を配置するGroup.hbm.xml

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

<hibernate-mapping package="org.hibernate.tutorial.domain"> 

    <class name="Group" table="Group"> 
        <id name="id" column="group_Id"> 
            <generator class="native"/> 
        </id> 
        <property name="name"></property>
        <set name="users">
        	<key column="groupID"></key>
        	<one-to-many class="org.hibernate.tutorial.domain.User" />
        </set>
    </class> 

</hibernate-mapping>

このクラスの集合プロパティusersを構成し、groupIDをマルチ外部キー列名(双方向:必ず一方の構成列名と一致)として、マルチクラスを構成します.
三、マルチユーザを配置する.hbm.xml

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

<hibernate-mapping package="org.hibernate.tutorial.domain"> 

    <class name="User" table="User"> 
        <id name="id" column="User_ID"> 
            <generator class="native"/> 
        </id> 
        <property name="name"></property>
        <many-to-one name="group" column="groupID"></many-to-one>
    </class> 

</hibernate-mapping>

このクラスのプロパティgroupを構成し、groupIDをこのクラス(複数)の外部キー列名とする(必ず一方が列名を一致させる)
四、hibernateを設定する.cfg.xml

<mapping resource="org/hibernate/tutorial/domain/Group.hbm.xml"/>
		<mapping resource="org/hibernate/tutorial/domain/User.hbm.xml"/>

五、テストは以上の通り