0

同じエンティティに対して複数の1対多の関係を構成するにはどうすればよいですか?

男の子とおもちゃの2つのクラスを考えてみましょう。以下のようになります

class Boy {
    @OneToMany(mappedBy='ownedBy',fetch=FetchType.EAGER, cascade=CascadeType.ALL)
    private List<Toy> bikes;
    ...
    @OneToMany(mappedBy='ownedBy',fetch=FetchType.EAGER, cascade=CascadeType.ALL)
    private List<Toy> cars;
    ...

class Toy {
    @ManyToOne
    private Boy ownedBy;
    ...

私はこの設定が間違っていることを知っています。しかし、ここで何を構成する必要があるのか​​わかりません。@OneToMany@ManyToOne注釈の両側にどのような構成を行う必要がありますか?

アノテーションに「mappedBy」を追加する前に、次の例外メッセージが表示されました

java.sql.SQLException: Field 'cars_Id' doesn't have a default value
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4096)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4028)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2490)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2651)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2683)
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2144)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2444)
    at com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:1997)

しかし、注釈に「mappedBy」が追加されていないときに作成された「boy_toy」のような結合テーブルがありました。追加した後、データベースに作成されたテーブルが表示されません。

  • アップデート

また、boy_toyテーブルには、boy_id、cars_id、bikes_idの3つの列がありました。ただし、理想的には、boy_idがnullではなく、他のnull許容列のようにする必要があります。しかし、生成されたすべての列はnull許容ではありませんでした。アノテーションから「mappedBy」を削除し、テーブル構造を手動で編集して、cars_idとbikes_idをnull許容にしようとしました。それは不思議のように働いた。

だから今、私が持っている唯一の残りの質問は

null許容列と非null許容列を含む結合テーブルを構成するために休止状態をどのように指示できますか?

4

1 に答える 1

0

継承を使用して、BOY と TOY の間に 1 対 N の関係を作成し、継承戦略 SINGLE_TABLE を使用します。Boy に接続されている Bikes または Cars のみを取得するには、ポリモヒック クエリを使用します。

おまけ: バイクと車のクラスが異なっていても、上記の設定は機能しません。その理由は、fetch=FetchType.EAGER では複数の 1-N 関係を持つことができないためです。これについては、私のブログで詳しく説明しています: MultipleBagFetchException と Java の等価性

編集: ポリモーフィック クエリ

単純:

entityManager.createQuery("SELECT toy FROM Toy toy"); // 自転車か車かに関係なく、すべての Toy インスタンスを返します

entityManager.createQuery("バイク バイクからバイクを選択"); // おもちゃの Bike タイプのインスタンスのみを返します

上記の式では、WHERE、結合など、他のすべての JPQL コンストラクトを使用できることは明らかです。

JPA2.0 を使用する場合は、型チェックや型キャストなどのポリモーフィズムに関するいくつかの新機能があります。こちらを参照してください: http://wiki.eclipse.org/EclipseLink/Release/2.1.0/JPAQueryEnhancements

于 2012-06-23T16:20:32.063 に答える