簡體   English   中英

在一堂課中休眠多對多關系

[英]Hibernate many One To Many relation in one class

我有三個實體,並且Main(User)實體與其他兩個實體有關,如何使用休眠在一個查詢中從數據庫中檢索三個實體的列表

package hib.test;

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

public class Country {
    private Integer id;
    private String country;
    private Set<User> userList = new HashSet<User>();

    public Country() {
        super();
        // TODO Auto-generated constructor stub
    }

    public Integer getId() {
        return id;
    }

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

    public String getCountry() {
        return country;
    }

    public void setCountry(String country) {
        this.country = country;
    }

    public Set<User> getUserList() {
        return userList;
    }

    public void setUserList(Set<User> userList) {
        this.userList = userList;
    }

}

User.java

package hib.test;

public class User {
    private Integer id;
    private UserType userType;
    private Country country;

    public User() {
        super();
        // TODO Auto-generated constructor stub
    }

    public Integer getId() {
        return id;
    }

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

    public UserType getUserType() {
        return userType;
    }

    public void setUserType(UserType userType) {
        this.userType = userType;
    }

    public Country getCountry() {
        return country;
    }

    public void setCountry(Country country) {
        this.country = country;
    }

}

UserType.java

package hib.test;

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

public class UserType {
    private Integer id;
    private String userType;
    private Set<User> userList = new HashSet<User>();

    public UserType() {
        super();
        // TODO Auto-generated constructor stub
    }

    public Integer getId() {
        return id;
    }

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

    public String getUserType() {
        return userType;
    }

    public void setUserType(String userType) {
        this.userType = userType;
    }

    public Set<User> getUserList() {
        return userList;
    }

    public void setUserList(Set<User> userList) {
        this.userList = userList;
    }

}

country.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">
<!-- Generated Jun 6, 2012 1:12:01 PM by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
    <class name="hib.test.Country" table="COUNTRY">
        <id name="id" type="java.lang.Integer">
            <column name="ID" />
            <generator class="assigned" />
        </id>
        <property name="country" type="java.lang.String">
            <column name="COUNTRY" />
        </property>
        <set name="userList" table="USER" inverse="false" lazy="true">
            <key>
                <column name="ID" />
            </key>
            <one-to-many class="hib.test.User" />
        </set>
    </class>
</hibernate-mapping>

user.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">
<!-- Generated Jun 6, 2012 1:12:01 PM by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
    <class name="hib.test.User" table="USER">
        <id name="id" type="java.lang.Integer">
            <column name="ID" />
            <generator class="assigned" />
        </id>
        <many-to-one name="userType" class="hib.test.UserType" fetch="join">
            <column name="USERTYPE" />
        </many-to-one>
        <many-to-one name="country" class="hib.test.Country" fetch="join">
            <column name="COUNTRY" />
        </many-to-one>
    </class>
</hibernate-mapping>

usertype.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">
<!-- Generated Jun 6, 2012 1:12:01 PM by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
    <class name="hib.test.UserType" table="USERTYPE">
        <id name="id" type="java.lang.Integer">
            <column name="ID" />
            <generator class="assigned" />
        </id>
        <property name="userType" type="java.lang.String">
            <column name="USERTYPE" />
        </property>
        <set name="userList" table="USER" inverse="false" lazy="true">
            <key>
                <column name="ID" />
            </key>
            <one-to-many class="hib.test.User" />
        </set>
    </class>
</hibernate-mapping>

如何通過一個查詢檢索List<User>List<Country>List<UserType>

編輯

public static List<UserType> getUserTypeList() {
    Session session = HibernateUtil.getSessionFactory().openSession();
    Transaction transaction = null;
    List<UserType> list = null;
    try {
        transaction = session.beginTransaction();
        list = session.createQuery("from UserType as u").list();
        if (list != null) {
            for (UserType uType : list)
                Hibernate.initialize(uType.getUserList());
        }
        transaction.commit();
    } catch (Exception e) {
        if (transaction != null)
            transaction.rollback();
        e.printStackTrace();
    } finally {
        session.close();
    }
    return list;
}

實際上,我有1個JTable和2個組合框,分別用於UserType和Country。因此,當我在組合框中選擇任何數據時,應根據所選值對JTable數據進行過濾,並且應在內存中保存所選的UserType和Country對象。

您需要執行以下三個查詢:

select u from User u;
select ut from UserType ut;
select c from Country c;

編輯:

如果您真正想要的是所有用戶類型的列表,以及每種用戶類型的用戶以及每種用戶類型的每個用戶的國家/地區,所有這些都加載在單個查詢中,則您需要獲取聯接,如Hibernate文檔

select userType from UserType userType
left join fetch userType.users user
left join fetch user.country

如果您想要一次關系數據並且內存不是問題,請執行lazy="false"

嘗試在用戶映射上將提取類型定義為EAGER,這樣,在加載用戶時,它將加載國家和用戶類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM