2014-02-05 25 views
0

無法將數據插入HSQL DB(內存中)。請幫我理解錯誤,從文本控制檯:HSQL - HIBERNATE。 org.hibernate.HibernateException:「.... Author.class」實例的標識符從1更改爲空

log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment). 
    log4j:WARN Please initialize the log4j system properly. 
    Hibernate: 
insert 
into 
    author 
    (ID, NAME, COUNTRY) 
values 
    (default, ?, ?) 
    Hibernate: 
insert 
into 
    book 
    (ID, NAME, GENRE, AUTHORID) 
values 
    (default, ?, ?, ?) 
    Hibernate: 
insert 
into 
    book 
    (ID, NAME, GENRE, AUTHORID) 
values 
    (default, ?, ?, ?) 
    org.hibernate.HibernateException: identifier of an instance of com.maven.vaadin.bookshelf.Author was altered from 1 to null 
at org.hibernate.event.def.DefaultFlushEntityEventListener.checkId(DefaultFlushEntityEventListener.java:85) 
at org.hibernate.event.def.DefaultFlushEntityEventListener.getValues(DefaultFlushEntityEventListener.java:190) 
at org.hibernate.event.def.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:147) 
at org.hibernate.event.def.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:219) 
at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:99) 
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50) 
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1206) 
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:375) 
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:137) 
at com.maven.vaadin.bookshelf.DBManager.save(DBManager.java:50) 
at com.maven.vaadin.bookshelf.MyVaadinUI.init(MyVaadinUI.java:43) 
at com.vaadin.ui.UI.doInit(UI.java:614) 
at com.vaadin.server.communication.UIInitHandler.getBrowserDetailsUI(UIInitHandler.java:223) 
at com.vaadin.server.communication.UIInitHandler.synchronizedHandleRequest(UIInitHandler.java:73) 
at com.vaadin.server.SynchronizedRequestHandler.handleRequest(SynchronizedRequestHandler.java:37) 
at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1371) 
at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:238) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) 
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) 
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023) 
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) 
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
at java.lang.Thread.run(Thread.java:744) 
    Hibernate: 
select 
    author0_.ID as ID0_, 
    author0_.NAME as NAME0_, 
    author0_.COUNTRY as COUNTRY0_ 
from 
    author author0_ 
    List size: 0 

連接DB和鏈接的Hibernate的配置來映射文件

<hibernate-configuration> 
<session-factory> 
    <!-- Database connection settings, Connect to HSQL, IN Memory --> 
    <property name="dialect">org.hibernate.dialect.HSQLDialect</property> 
    <property name="connection.driver_class">org.hsqldb.jdbcDriver</property> 
    <property name="connection.url">jdbc:hsqldb:mem:test</property> 
    <property name="connection.username">sa</property> 
    <property name="connection.password"></property> 
    <!-- JDBC connection pool (use the built-in) --> 
    <property name="connection.pool_size">1</property> 
    <!-- Echo all executed SQL to stdout --> 
    <property name="show_sql">true</property><property name="format_sql">true</property> 
    <!-- Disable the second-level cache --> 
    <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property> 
    <!--create the database schema on startup if required --> 
    <property name="hbm2ddl.auto">update</property> 
    <mapping resource="com/maven/vaadin/bookshelf/Author.hbm.xml"/> 
    <mapping resource="com/maven/vaadin/bookshelf/Book.hbm.xml"/> 
</session-factory> 

Hibernate映射文件。第一:

<hibernate-mapping package="com.maven.vaadin.bookshelf"> 
<class name="com.maven.vaadin.bookshelf.Author" table="author"> 
    <id name="id" type="java.lang.Long"> 
     <column name="ID" /> 
     <generator class="native" /> 
    </id> 
    <property name="name" type="java.lang.String"> 
     <column name="NAME" length="64" not-null="true" unique="true" /> 
    </property>  
    <property name="country" type="java.lang.String"> 
     <column name="COUNTRY" length="32" not-null="true" /> 
    </property>  
    <set name="authorbook" table="book" cascade="all" inverse="true"> 
     <key column="AUTHORID" not-null="true" /> 
     <one-to-many class="com.maven.vaadin.bookshelf.Book" /> 
    </set> 
</class> 

二:

<hibernate-mapping package="com.maven.vaadin.bookshelf"> 
<class name="com.maven.vaadin.bookshelf.Book" table="book"> 
    <id name="id" type="java.lang.Long"> 
     <column name="ID" /> 
     <generator class="native" /> 
    </id> 
    <property name="name" type="java.lang.String"> 
     <column name="NAME" length="32" not-null="true" /> 
    </property> 
    <property name="genre" type="java.lang.String"> 
     <column name="GENRE" length="32" not-null="true" /> 
    </property>  
    <many-to-one name="author" class="com.maven.vaadin.bookshelf.Author" not-null="true"> 
     <column name="AUTHORID" /> 
    </many-to-one> 
</class> 

Java類:

public class Author implements Serializable{ 
private Long id; 
private String name; 
private String country; 
private Set<Book> authorbook = new HashSet<Book>(); 

public Author(String name, String country, Set<Book> authorBook){ 
    super(); 
    this.name = name; 
    this.country = country; 
    this.authorbook = authorbook; 
} 
public Author(){} 

public void setId(Long Id){this.id = id;} 
public Long getId(){return id;} 

public void setName(String name){this.name = name;} 
public String getName(){return name;} 

public void setCountry(String country){this.country = country;} 
public String getCountry(){return country;} 

public void setAuthorbook(Set<Book> authorBook){this.authorbook = authorBook;} 
public Set<Book> getAuthorbook(){return authorbook;} 

public void addBook(Book book){ 
    book.setAuthor(this); 
    this.authorbook.add(book); 
}} 

public class Book implements Serializable{ 
private Long id; 
private String name; 
private String genre; 
private Author author; 

public Book(String name, String genre){ 
    super(); 
    this.name = name; 
    this.genre = genre; 
} 
public Book(){} 

public void setId(Long id){this.id = id;} 
public Long getId(){return id;} 

public void setName(String name){this.name = name;} 
public String getName(){return name;} 

public void setGenre(String genre){this.genre = genre;} 
public String getGenre(){return genre;} 

public void setAuthor(Author author){this.author = author;} 
public Author getAuthor(){return author;}} 

public class DBManager { 

public static void main(String[] args){ 
    Session session = HibernateUtil.getSessionFactory().openSession(); 
    session.beginTransaction(); 
    DBManager app = new DBManager(); 
    app.save("Author","Country"); 
    app.list(); 
} 

public void save(String authorName, String authorCountry){ 
    Session session = HibernateUtil.getSessionFactory().openSession(); 
    session.beginTransaction(); 
    Long id = null; 
    Transaction transaction = null; 

    try { 
     transaction = session.beginTransaction(); 
     Author author = new Author(); 
     author.setName(authorName); 
     author.setCountry(authorCountry); 

     Book bk1 = new Book(); 
     Book bk2 = new Book(); 
     bk1.setName("Book1");; 
     bk1.setGenre("Genre1"); 

     bk2.setName("Book2");; 
     bk2.setGenre("Genre2"); 
     author.addBook(bk1); 
     author.addBook(bk2); 
     session.save(author); 

     transaction.commit(); 
    } catch (HibernateException e) { 
     transaction.rollback(); 
     e.printStackTrace(); 
    } finally { 
     session.close(); 
    } 

} 

public void list() { 
    Session session = HibernateUtil.getSessionFactory().openSession(); 
    Transaction transaction = null; 
    try { 
     transaction = session.beginTransaction(); 
     @SuppressWarnings("unchecked") 
     List<Author> list = session.createQuery("FROM Author").list(); 

     System.out.println("List size: " + (list).size()); 
     for (Iterator iterator = list.iterator(); iterator.hasNext();) { 
      Author author = (Author) iterator.next(); 
     } 
     transaction.commit(); 
    } catch (HibernateException e) { 
     transaction.rollback(); 
     e.printStackTrace(); 
    } finally { 
     session.close(); 
    } 
}} 
+3

好吧,祝你好運。如果您對自己解決問題有任何疑問,請隨時詢問他們:/ – Gimby

回答

2

問題的屬性id的setter方法。您通過標識,而不是ID我是在大寫) - 用於其休眠拋出異常 你應該setter方法參數的名字從ID更改ID,它會工作。

public void setId(Long id) { 
    this.id = id; 
} 

即使您從this.id = id更改爲this.id = Id也可以。

public void setId(Long Id) { 
    this.id = Id; 
} 
+0

非常感謝! – user3271450

+3

在這個網站上說「謝謝」的典型方式是點擊此答案旁邊複選標記的大綱。請參閱http://stackoverflow.com/help/someone-answers – GreenGiant

相關問題