Hibernate version :- hibernate-3.2.1.ga.
I am using a library example , the diagram is on this page at the top.
http://www.eclipse.org/modeling/emf/docs/1.x/tutorials/glibmod/glibmod_emf1.1.html#top
I have created the folowing already:
Library:My Library
Writer: JRR Tolkien
Book: The Hobbit
As a next step I am trying to add more books to an existing Writer.
I have a many-to-one relationship between book and writer
I have set cascade=persist, so that when i add a new book and save it, the existing writer gets persisted.
Code:
<many-to-one name="author" entity-name="Writer" lazy="false"
cascade="persist,save-update,lock" foreign-key="book_author" insert="true"
update="true" not-null="false">
<column not-null="false" unique="false" name="`myauthor_id`"/>
</many-to-one>
There is a one-to-many relationship between writer and book. And the books are ordered by book_title.
Code:
<bag name="books" order-by="book_title" inverse="true" lazy="true"
cascade="merge,persist,save-update,lock">
<key update="true">
<column name="`myauthor_id`" not-null="false" unique="false"/>
</key>
<one-to-many entity-name="Book"/>
</bag>
Code to add more books
Code:
Query query = session.createQuery("FROM Library");
List libraries = query.list();
Library lib = (Library) libraries.get(0);
System.out.println(lib.getName());
// read a writer
query = session.createQuery("FROM Writer where name='JRR Tolkien'");
List<Writer> writers = query.list();
Writer writer = writers.get(0);
System.out.println(writer.getName());
// add new books
LibraryFactory libFactory = LibraryFactory.eINSTANCE;
Book book1 = libFactory.createBook();
(119) book1.setAuthor(writer);
book1.setPages(306);
book1.setTitle("HIJK");
book1.setCategory(BookCategory.MYSTERY);
lib.getBooks().add(book1);
Hiberante mapping file:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping auto-import="false">
<class name="library.impl.BookImpl" entity-name="Book" abstract="false" lazy="false" table="`mybooktable`">
<meta attribute="eclassName">Book</meta>
<meta attribute="epackage">library.ecore</meta>
<id name="id" type="java.lang.Integer">
<column not-null="true" unique="false" name="`id`"/>
<generator class="native"/>
</id>
<version name="version" type="int">
<column not-null="false" unique="false" name="`writelock`"/>
</version>
<property name="title" lazy="false" insert="true" update="true" not-null="false" unique="false" type="java.lang.String">
<column not-null="false" unique="false" name="`book_title`"/>
</property>
<property name="pages" lazy="false" insert="true" update="true" not-null="false" unique="false" type="int">
<column not-null="false" unique="false" name="`page_count`"/>
</property>
<property name="category" lazy="false" not-null="true" insert="true" update="true" unique="false">
<column not-null="true" unique="false" name="`category`"/>
<type name="org.eclipse.emf.teneo.hibernate.mapping.ENumUserType">
<param name="enumClass">library.BookCategory</param>
</type>
</property>
<many-to-one name="author" entity-name="Writer" lazy="false" cascade="persist,save-update,lock" foreign-key="book_author" insert="true" update="true" not-null="false">
<column not-null="false" unique="false" name="`myauthor_id`"/>
</many-to-one>
</class>
<class name="library.impl.LibraryImpl" entity-name="Library" abstract="false" lazy="false" discriminator-value="Library" table="`library`">
<meta attribute="eclassName">Library</meta>
<meta attribute="epackage">library.ecore</meta>
<id name="id" type="java.lang.Integer">
<column not-null="true" unique="false" name="`id`"/>
<generator class="native"/>
</id>
<discriminator column="`dtype`" type="string"/>
<version name="version" type="int">
<column not-null="true" unique="false" name="`version`"/>
</version>
<property name="name" lazy="false" insert="true" update="true" not-null="true" unique="false" type="java.lang.String">
<column not-null="true" unique="false" name="`name`"/>
</property>
<list name="books" lazy="true" cascade="all,delete-orphan">
<key update="true" foreign-key="library_books">
<column name="`library_books_id`" not-null="false" unique="false"/>
</key>
<list-index column="`library_books_idx`"/>
<one-to-many entity-name="Book"/>
</list>
<list name="writers" lazy="true" cascade="all,delete-orphan">
<key update="true" foreign-key="library_writers">
<column name="`library_writers_id`" not-null="false" unique="false"/>
</key>
<list-index column="`library_writers_idx`"/>
<one-to-many entity-name="Writer"/>
</list>
</class>
<class name="library.impl.WriterImpl" entity-name="Writer" abstract="false" lazy="false" discriminator-value="Writer" table="`writer`">
<meta attribute="eclassName">Writer</meta>
<meta attribute="epackage">library.ecore</meta>
<id name="id" type="java.lang.Integer">
<column not-null="true" unique="false" name="`id`"/>
<generator class="native"/>
</id>
<discriminator column="`dtype`" type="string"/>
<version name="version" type="int">
<column not-null="true" unique="false" name="`version`"/>
</version>
<property name="name" lazy="false" insert="true" update="true" not-null="true" unique="false" type="java.lang.String">
<column not-null="true" unique="false" name="`name`"/>
</property>
<bag name="books" order-by="book_title" inverse="true" lazy="true" cascade="merge,persist,save-update,lock">
<key update="true">
<column name="`myauthor_id`" not-null="false" unique="false"/>
</key>
<one-to-many entity-name="Book"/>
</bag>
</class>
</hibernate-mapping>
throws the following exception.
How do I resolve this problem?
Code:
11:53:56,142 DEBUG JDBCExceptionReporter:108 - could not initialize a
collection: [Writer.books#5] [select books0_."myauthor_id" as myauthor6_1_,
books0_."id" as id1_1_, books0_."id" as id1_0_0_, books0_."writelock" as
writelock2_0_0_, books0_."book_title" as book3_0_0_, books0_."page_count" as
page4_0_0_, books0_."category" as category5_0_0_, books0_."myauthor_id" as
myauthor6_0_0_, books0_.econtainer_class as econtainer9_0_0_,
books0_.e_container as e10_0_0_, books0_.e_container_featureid as e11_0_0_,
books0_1_."level" as level2_3_0_, case when books0_1_."book_id" is not null
then 1 when books0_."id" is not null then 0 end as clazz_0_ from
"mybooktable" books0_ left outer join "schoolbook" books0_1_ on
books0_."id"=books0_1_."book_id" where books0_."myauthor_id"=? order by
books0_.book_title]
java.sql.SQLException: ORA-00904: "BOOKS0_"."BOOK_TITLE": invalid identifier
at
oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:111)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:330)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:287)
at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:742)
at
oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:212)
at
oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:795)
at
oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1030)
at
oracle.jdbc.driver.T4CPreparedStatement.executeMaybeDescribe(T4CPreparedStatement.java:835)
at
oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1123)
at
oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3284)
at
oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3328)
at
org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:186)
at org.hibernate.loader.Loader.getResultSet(Loader.java:1778)
at org.hibernate.loader.Loader.doQuery(Loader.java:662)
at
org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
at org.hibernate.loader.Loader.loadCollection(Loader.java:1985)
at
org.hibernate.loader.collection.CollectionLoader.initialize(CollectionLoader.java:36)
The fist line of the Exception has a query
When I execute it in Toad I get the following error
Code:
SELECT books0_."myauthor_id" AS myauthor6_1_, books0_."id" AS id1_1_,
books0_."id" AS id1_0_0_, books0_."writelock" AS writelock2_0_0_,
books0_."book_title" AS book3_0_0_,
books0_."page_count" AS page4_0_0_,
books0_."category" AS category5_0_0_,
books0_."myauthor_id" AS myauthor6_0_0_,
books0_.econtainer_class AS econtainer9_0_0_,
books0_.e_container AS e10_0_0_,
books0_.e_container_featureid AS e11_0_0_
FROM "mybooktable" books0_
WHERE books0_."myauthor_id" = 5
ORDER BY books0_.book_title
"ORA-00904: "BOOKS0_"."BOOK_TITLE": invalid identifier"
But when i put quotes around book_title it works
Code:
SELECT books0_."myauthor_id" AS myauthor6_1_, books0_."id" AS id1_1_,
books0_."id" AS id1_0_0_, books0_."writelock" AS writelock2_0_0_,
books0_."book_title" AS book3_0_0_,
books0_."page_count" AS page4_0_0_,
books0_."category" AS category5_0_0_,
books0_."myauthor_id" AS myauthor6_0_0_,
books0_.econtainer_class AS econtainer9_0_0_,
books0_.e_container AS e10_0_0_,
books0_.e_container_featureid AS e11_0_0_
FROM "mybooktable" books0_
WHERE books0_."myauthor_id" = 5
ORDER BY books0_."book_title"
why aren't there quotes in the orderby clause around book_title