3

jaxb を使用して、Author と Books の間の多対多の関係を含むいくつかの hibernate マップ クラスを自動生成しようとしています。データベースはpostgresです。私が達成しようとしているのは、以下のような Authors.java と Books.java です。

目標: Books.java

@ManyToMany(targetEntity = Author.class, cascade = {
    CascadeType.ALL
    }, mappedBy="books")
    public List<Author> getAuthors() {
    if (authors == null) {
        authors = new ArrayList<AUTHOR>();
    }
    return this.authors;
    }

ここに bindings.xjb があります (その一部)

 <?xml version="1.0" encoding="UTF-8"?>
 <bindings xmlns="http://java.sun.com/xml/ns/jaxb" version="2.0"
xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
    xmlns:hj="http://hyperjaxb3.jvnet.org/ejb/schemas/customizations"
xmlns:orm="http://java.sun.com/xml/ns/persistence/orm"
jaxb:extensionBindingPrefixes="hj orm">

<jaxb:bindings schemaLocation="types.xsd"
    node="/xs:schema">

    <jaxb:bindings
            node="xs:complexType[@name='author']//xs:element[@name='books']">
                   <hj:many-to-many>
                         <orm:join-table name="AUTHORS_BOOKS">
                                <orm:join-column name="aid" />
                                <orm:inverse-join-column name="bid"/>
                         </orm:join-table>
                   </hj:many-to-many>
     </jaxb:bindings>

    <jaxb:bindings
            node="xs:complexType[@name='book']//xs:element[@name='authors']">
                   <hj:many-to-many name="authors" mapped-by="books">
                       <hj:cascade>
                       <hj:cascade-persist/>
                       </hj:cascade>
                   </hj:many-to-many>
     </jaxb:bindings>


    <jaxb:bindings
        node="xs:complexType[@name='author']//xs:element[@name='aid']">
        <hj:id>
            <orm:generated-value strategy="AUTO" />
        </hj:id>
    </jaxb:bindings>

    <jaxb:bindings
        node="xs:complexType[@name='book']//xs:element[@name='bid']">
        <hj:id>
            <orm:generated-value strategy="AUTO" />
        </hj:id>
    </jaxb:bindings>

</bindings>

これが types.xsd (その一部) です。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 <xs:schema version="1.0" targetNamespace="http://catapult.jieddo.mil/feeds/domain"
xmlns:tns="http://catapult.jieddo.mil/feeds/domain"   
    xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:complexType name="author">
    <xs:sequence>
        <xs:element name="id" type="xs:long"/>
        <xs:element name="name" type="xs:string" />
        <xs:element name="books" type="tns:book" minOccurs="0" maxOccurs="1000"/>
    </xs:sequence>
</xs:complexType>

<xs:complexType name="book">
    <xs:sequence>
        <xs:element name="id" type="xs:long"/>
        <xs:element name="name" type="xs:string"/>
        <xs:element name="authors" type="tns:author" minOccurs="0" maxOccurs="1000"/>
    </xs:sequence>
</xs:complexType>

</xs:schema>

上記のバインディングと xsd を使用して、生成しているファイルを以下に示します。

現在: Authors.java

    @ManyToMany(targetEntity = Book.class, cascade = {
    CascadeType.ALL
})
@JoinTable(name = "AUTHORS_BOOKS", joinColumns = {
    @JoinColumn(name = "aid")
}, inverseJoinColumns = {
    @JoinColumn(name = "bid")
})
public List<Book> getBooks() {
    if (books == null) {
        books = new ArrayList<Book>();
    }
    return this.books;
}

現在: Books.java

    @ManyToMany(targetEntity = Author.class, cascade = {
    CascadeType.ALL
}, mappedBy="books")
@JoinTable(name = "BOOK_AUTHORS_BOOK", joinColumns = {
    @JoinColumn(name = "PARENT_BOOK_ID")
}, inverseJoinColumns = {
    @JoinColumn(name = "CHILD_AUTHOR_ID")
})
public List<Author> getAuthors() {
    if (authors == null) {
        authors = new ArrayList<AUTHOR>();
    }
    return this.authors;
}

現在の Book.java では、@JoinTable 表記は存在しないと思います (テーブル名も間違っています)。フェッチを遅延させるか、バインディングで宣言しないままにしておくと、遅延初期化エラーが発生し続けます。

org.hibernate.LazyInitializationException: ロールのコレクションを遅延初期化できませんでした

fetch="EAGER" を作成すると、次のエラーが発生します。

org.hibernate.loader.MultipleBagFetchException: 複数のバッグを同時にフェッチすることはできません

そして、私のマッピングの何かが間抜けであるため、これらの問題が発生していると思います。ここで何が起こっているかについてのアイデアはありますか?

4

0 に答える 0