シングル双方向マルチペアマルチ外部接続
次は双方向多対多です
まずBean永続化クラス、CategoryとItem
Categoryクラス
Itemクラス
次に、永続化クラスのXMLプロファイル
Category.hbm.xml
Item.hbm.xml
hibernate.cfg.xml
HibernateTestテストクラス
一方向多対多では、2つのBean永続化クラスに1つのSetを書くだけで、永続化クラスXMLファイルに1つのSetノードを構成するだけで、2つのSetノードのinverse="true"属性を削除します.デフォルトはfalseなので、setを構成した永続化クラスはデフォルトで関連関係を維持します.
まずBean永続化クラス、CategoryとItem
Categoryクラス
public class Category {
private Integer id;
private String name;
private Set<Item> items = new HashSet<Item>();
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 Set<Item> getItems() {
return items;
}
public void setItems(Set<Item> items) {
this.items = items;
}
}
Itemクラス
public class Item {
private Integer id;
private String name;
private Set<Category> categories = new HashSet<Category>();
public Set<Category> getCategories() {
return categories;
}
public void setCategories(Set<Category> categories) {
this.categories = categories;
}
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;
}
}
次に、永続化クラスのXMLプロファイル
Category.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 package="entity5">
<class name="Category" table="category">
<!-- id: ,name: -->
<id name="id" type="java.lang.Integer">
<!-- name: -->
<column name="id"/>
<!-- ,native: -->
<generator class="native"/>
</id>
<!-- property -->
<property name="name" type="java.lang.String">
<column name="name"/>
</property>
<!-- : , XML , set table , , set ! inverse="true" XML -->
<!-- table: -->
<set name="items" table="category_item">
<key>
<column name="c_id"></column>
</key>
<!-- many-to-many , column: Set -->
<many-to-many class="Item" column="i_id"></many-to-many>
</set>
</class>
</hibernate-mapping>
Item.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 package="entity5">
<class name="Item" table="items">
<!-- id: ,name: -->
<id name="id" type="java.lang.Integer">
<!-- name: -->
<column name="id"/>
<!-- ,native: -->
<generator class="native"/>
</id>
<!-- property -->
<property name="name" type="java.lang.String">
<column name="name"/>
</property>
<!-- : , XML , set table , , set ! inverse="true" -->
<!-- table: -->
<set name="categories" table="category_item" inverse="true">
<key>
<column name="i_id"></column>
</key>
<!-- many-to-many , column: Set -->
<many-to-many class="Item" column="c_id"></many-to-many>
</set>
</class>
</hibernate-mapping>
hibernate.cfg.xml
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- -->
<property name="connection.username">root</property>
<property name="connection.password">1234</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/hibernate</property>
<!-- Hibernate -->
<!-- Hibernate -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- SQL -->
<property name="show_sql">true</property>
<!-- SQL -->
<property name="format_sql">true</property>
<!-- -->
<property name="hbm2ddl.auto">update</property>
<!-- / , Bean xml -->
<!-- : . / -->
<!-- <mapping resource="entity1/Customer.hbm.xml"/> <mapping resource="entity1/Order.hbm.xml"/> -->
<!-- <mapping resource="entity2/Customer.hbm.xml"/> <mapping resource="entity2/Order.hbm.xml"/> -->
<!-- <mapping resource="entity3/Department.hbm.xml"/> <mapping resource="entity3/Manager.hbm.xml"/> -->
<mapping resource="entity5/Category.hbm.xml"/>
<mapping resource="entity5/Item.hbm.xml"/>
</session-factory>
</hibernate-configuration>
HibernateTestテストクラス
public class HibernateTest {
private SessionFactory sessionFactory;
private Session session;
private Transaction transaction;
@Before
public void init() {
// 1. SessionFactory
sessionFactory = null;
// 1. Configuration : Hibernate
// configure(); , hibernate.cfg.xml
Configuration configuration = new Configuration().configure();
/** * new Configuration * * hibernate.properties * 1:Configuration configuration = new Configuration(); * * , hibernate.cfg.xml * 2:Configuration configuration = new Configuration().configure(); * * , xml, File * 3:Configuration configuration = new Configuration().configure(file); */
// 2. ServiceRegistry
// Hibernate
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder()
.applySettings(configuration.getProperties())
.buildServiceRegistry();
// 3. SessionFactory
sessionFactory = configuration.buildSessionFactory(serviceRegistry);
// 2. Session
session = sessionFactory.openSession();
// 3.
transaction = session.beginTransaction();
}
@After
public void distroy() {
// 5.
transaction.commit();
// 6. Session
session.close();
// 7. SessionFactory
sessionFactory.close();
}
//
@Test
public void test1(){
Category category1 = new Category();
category1.setName("c1");
Category category2 = new Category();
category2.setName("c2");
Item item1 = new Item();
item1.setName("i1");
Item item2 = new Item();
item2.setName("i2");
//
category1.getItems().add(item1);
category1.getItems().add(item2);
category2.getItems().add(item1);
category2.getItems().add(item2);
item1.getCategories().add(category1);
item1.getCategories().add(category2);
item2.getCategories().add(category1);
item2.getCategories().add(category2);
//
session.save(category1);
session.save(category2);
session.save(item1);
session.save(item2);
}
//
@Test
public void test2(){
// ,Category items ,
Category category = (Category) session.get(Category.class,1);
System.out.println(category.getName());
//
Set<Item> items = category.getItems();
System.out.println(items.size());
}
}
一方向多対多では、2つのBean永続化クラスに1つのSetを書くだけで、永続化クラスXMLファイルに1つのSetノードを構成するだけで、2つのSetノードのinverse="true"属性を削除します.デフォルトはfalseなので、setを構成した永続化クラスはデフォルトで関連関係を維持します.