5

Banneers と BannerGroup という名前の 2 つのクラスがあります。

双方向の関係を作成しました。私の場合、BannerGroup は多くの Banner を持つことができ、多くの Banner は同じ BannerGroup 内に属します。

Mysqlテーブルは...

mysql> desc Banners;
+------------------+--------------+------+-----+---------+-----------------------------+
| Field            | Type         | Null | Key | Default | Extra                       |
+------------------+--------------+------+-----+---------+-----------------------------+
| banner_id        | int(11)      | NO   | PRI | NULL    | auto_increment              | 
| banner_name      | varchar(255) | YES  |     | NULL    |                             | 
| banner_group_id  | int(11)      | YES  | MUL | NULL    |                             | 
+------------------+--------------+------+-----+---------+-----------------------------+

mysql> desc Banner_Group;
+---------------------+--------------+------+-----+----------------+-----------------------------+
| Field               | Type         | Null | Key | Default        | Extra                       |
+---------------------+--------------+------+-----+----------------+-----------------------------+
| group_id            | int(11)      | NO   | PRI | NULL           | auto_increment              | 
| group_name          | varchar(255) | NO   | MUL | NULL           |                             | 
+---------------------+--------------+------+-----+----------------+-----------------------------+

私のモデルクラスはこんな感じです...

Class Banners
{
    private Integer bannerId;
    private String bannerName;
    private BannerGroup bannerGroupDO;

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name = "banner_id")
    public Integer getBannerId() {
        return bannerId;
    }

    public void setBannerId(Integer bannerId) {
        this.bannerId = bannerId;
    }

    @Column(name = "banner_name")
    public String getBannerName() {
        return bannerName;
    }

    public void setBannerName(String bannerName) {
        this.bannerName = bannerName;
    }

    @ManyToOne(fetch = FetchType.EAGER, optional=false)
    @JoinColumn(name = "banner_group_id",  nullable = false)
    public BannerGroup getAffiliateBannerGroup() {
        return bannerGroupDO;
    }

    public void setAffiliateBannerGroup(BannerGroup bannerGroupDO) {
        this.bannerGroupDO = bannerGroupDO;
    }
}

Class BannerGroup{

    private int group_id;
    private int group_name;
    private List<Banners> banners;

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name = "group_id")
    public Integer getGroupId() {
        return groupId;
    }

    public void setGroupId(Integer groupId) {
        this.groupId = groupId;
    }

    @Column(name = "group_name")
    public String getGroupName() {
        return groupName;
    }

    public void setGroupName(String groupName) {
        this.groupName = groupName;
    }

    @OneToMany(mappedBy="bannerGroupDO", fetch = FetchType.LAZY)
    public List<Banners> getBanners() {
        return banners;
    }

    public void setBanners(List<Banners> banners) {
    this.banners = banners;
    }
}

今、私がバナーを取得しようとしているとき(熱心にロードされたBannerGroupです)

Query q = session.createQuery("from com.abc.xyz.model.Banners where bannerId = 123");

私はこれを得た...

Hibernate: select b.banner_id as banner1_294_, b.banner_name as banner2_294_ from Banners b where b.banner_id=?
Hibernate: select bg.group_id as group1_295_0_, bg.group_name as group9_295_0_ from Banner_Group bg where bg.group_id=?

私が欲しいもの: Hibernate は、複数 (2)のクエリではなく、単一のクエリを実行する 必要があります。休止状態が「内部結合」クエリを起動するようにしたい...のようなもの...

select b.*, bg.* from Banners b INNER JOIN Banner_Group bg ON b.banner_group_id=bg.group_id;

私の質問は...

1.) 関連付けを指定したにもかかわらず、休止状態が単一のクエリではなく複数のクエリを実行するのはなぜですか。?

2.) この問題に対してどうすればよいでしょうか?

JPQL/HQLを実行したくありません。つまり、行動フォームの関連付けのみを取得したいのです。次のようなクエリを実行して結果が欲しいだけです...from com.abc.xyz.model.Banners where bannerId = 123;

3.) 私はそれを知っています... 2 つのクエリを個別に実行した結果と 1 つのクエリを実行した結果は同じです。しかし、これはDBのパフォーマンスに影響すると思います。または、DBのブルーデンである可能性があります。私が間違っている?

Radim Köhler の回答の後...私は Banners.java で自分のコードを編集しました...(まだ問題は解決されていません)

@ManyToOne(fetch = FetchType.EAGER, optional=false)
    @JoinColumn(name = "banner_group_id",  nullable = false)
    @Fetch(FetchMode.JOIN)
    public AffiliateBannerGroup getAffiliateBannerGroup() {
        return affiliateBannerGroup;
    }

    public void setAffiliateBannerGroup(AffiliateBannerGroup affiliateBannerGroup) {
        this.affiliateBannerGroup = affiliateBannerGroup;
    }
4

1 に答える 1