16

間にマッピング テーブルがある 2 つのテーブル間の多対多の関係で、2 番目のエンティティの ID のみを読み込むにはどうすればよいですか。

以下は、ここで達成したいことを説明する例です。以下はサンプルスキーマです

create table user(
 id int PrimaryKey,
 name text
)
create table pages (
 id int PrimaryKey,
 page_name text
)
create table user_page (
 id_user int,
 id_page int,
 PrimaryKey (id_user, id_page)
)

注: ユーザー テーブルとページ テーブルには追加の列がありますが、簡潔にするためにここには含めていません。

ユーザー エンティティ:

@Entity
@Table(name = "user")
public class User {
 @id
 @column(name="id")
 private Integer id;
 @column(name="name")
 private String name;
 ... 
 ...
}

@Entity
@Table(name = "page")
public class Page {
 @id
 @column(name="id")
 private Integer id;
 @column(name="page_name")
 private String name;
 ... 
 ...
}

私がやりたいことは、クラスに別の属性Set<Integer> pageIdsを追加Userし、このコレクション内のユーザーにすべてのページ ID をマップすることです。

Hibernateを使用してこれを行うにはどうすればよいですか?

4

2 に答える 2

33

Userクラスで:

@ManyToMany
@JoinTable(
    name="user_page",
    joinColumns = @JoinColumn(name="id_user"),
    inverseJoinColumns = @JoinColumn(name="id_page")
)
public Set<Page> pages;

返されたセットを反復処理することで、ID を取得できます。デフォルトでは、コレクションは遅延ロードされます (つまり、ID のみ)。

編集Page:何らかの理由でマップしたくない場合は、次@ElementCollectionのように使用できます。

@ElementCollection
@CollectionTable(name="user_page", joinColumns=@JoinColumn(name="id_user"))
@Column(name="id_page")
public Set<Long> pageIds;
于 2013-06-09T00:59:47.903 に答える
0

pagesと の両方をマップしたいときに、受け入れられた回答で問題が発生しましたpageIds。Hibernate はこれらのフィールドの両方を使用して、aUserが保存されたときにマッピング テーブルを変更し、多くの奇妙な動作を引き起こす可能性があります。

代わりに、次を使用してコレクションを作成および入力することでこれを解決しました。pageIds @Transient@PostLoad

@ManyToMany
@JoinTable(
    name="user_page",
    joinColumns = @JoinColumn(name="id_user"),
    inverseJoinColumns = @JoinColumn(name="id_page")
)
public Set<Page> pages;

@Transient
public Set<Long> pageIds;

@PostLoad
private void postLoad() {
    pageIds = pages.stream().map(Page::getId).collect(Collectors.toSet());
}
于 2017-08-07T17:03:07.557 に答える