3

Hibernate で JPA アノテーションを使用していますが、関連付けテーブルの管理方法がよくわかりません。

エンティティ関係

エンティティ関係 (ER) ダイアグラムとしての私のデータベース スキーマは次のとおりです。

  COUNTRY          COUNTRY_MOVIE        
|---------|*    *|---------------|      | MOVIE   |
| COU_ID  |<---->| COUNTRY_ID    |*    *|---------|
| LABEL   |      | MOVIE_ID      |<---->| MO_ID   |
|---------|      |---------------|      | LABEL   |
                                        |---------|

このテーブルCOUNTRY_MOVIEは、多対多の関連付け ( で表される多対多を上の矢印線で表したもの)の間の関連付けテーブルです。COUNTRYMOVIE* *

JPA を使用してコードでモデル化されたエンティティー

私の JPA オブジェクトでは、CountryMovie.javaクラスを作成しませんでした。

しかし、私は次のコードのように使用@JoinTableします:Country.java

//Package, Import...

@Entity
@Table(name="COUNTRY")
public class Country implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="COU_ID")
    private Integer couID;

    @Column(name="LABEL")
    private String label;

    //bi-directional many-to-many association to TFilmFil
    @ManyToMany
    @JoinTable(
        name="COUNTRY_MOVIE"
        , joinColumns={
            @JoinColumn(name="COU_ID")
            }
        , inverseJoinColumns={
            @JoinColumn(name="MO_ID")
            }
        )
    private List<Movie> movies;

    public Country() {
        super();
    }
    
    // Other constructor, Getter & Setter, and "toString" method...
}

映画

そして、私は注釈Movie.javaのみを使用します:@ManyToMany

//Package, Import...

@Entity
@Table(name="MOVIE")
public class Movie implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="MO_ID")
    private Integer moId;

    @Column(name="LABEL")
    private String label;

    //bi-directional many-to-many association to TrPaysPay
    @ManyToMany(mappedBy="movies")
    private List<Country> countries;

    public Film() {
        super();
    }

    // Other constructor, Getter & Setter, and "toString" method...
}

問題 1:LazyInitializationException

この種の関連テーブルを管理するのに最適な方法であるかどうかはわかりません。

しかし、映画のすべての国を取得しようとすると、LazyInitializationExceptionHibernate から取得します。

問題2:試した後FetchType.EAGER

そこで、各多対多アノテーションに fetch EAGER を追加しようとしました。

Country

@ManyToMany(fetch=FetchType.EAGER)
@JoinTable(

Movie

@ManyToMany(mappedBy="movies",fetch=FetchType.EAGER)

次に、これを取得します:

org.springframework.beans.factory.support.DefaultSingletonBeanRegistry destroySingletons

質問

  1. マップする別の Java クラスを作成する必要がありますCOUNTRY_MOVIEか?
  2. または、現在と同じ Java クラスを使用してこの問題を解決する方法はありますか?
4

3 に答える 3

1

マッピングは問題ありません (3 番目のクラスは必要ありません)。また、熱心なフェッチにする必要もありません。問題はクエリ コードにあります。コレクションにアクセスするときは、セッションがまだ開いていることを確認する必要があります。

質問をクエリコードで更新してください。修正方法を教えてください。

于 2012-10-27T05:36:26.753 に答える
0

MyDao.javaすべての国と関連する映画を取得するためのクエリを次に示します。

@Transactional
public class myDao implements IMyDao, Serializable {

  private static final long serialVersionUID = 1L;
  @PersistenceContext
  private EntityManager em;

    public List<Country> getAllCountries() {
        try {
            return em.createQuery("select cou from Country cou").getResultList();
        } catch (Throwable th) {
            // Throw Exception
        }
    }
}

結合を使用して、映画のリストを明示的に取得する必要があると思います。

于 2012-10-27T09:11:43.843 に答える