シングル双方向マルチペアマルチ外部接続


次は双方向多対多です
まず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を構成した永続化クラスはデフォルトで関連関係を維持します.