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: 複数のバッグを同時にフェッチすることはできません
そして、私のマッピングの何かが間抜けであるため、これらの問題が発生していると思います。ここで何が起こっているかについてのアイデアはありますか?