2010-06-01 2 views
1

у меня есть следующие классыПомощь с отображением Hibernate

public class RSS 
{ 
    private Integer id; 
    private String title; 
    private String description; 
    private String link; 
    private Date dateCreated; 
    private Collection rssItems; 
    private String url; 
    private String language; 
    private String rating; 
    private Date pubDate; 
    private Date lastBuildDate; 
    private User user; 
    private Date dateModified; 

    public RSS() { 
    } 

    public Integer getId() { 
     return id; 
    } 

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

    public String getTitle() { 
     return title; 
    } 

    public void setTitle(String title) { 
     this.title = title; 
    } 

    public void setDescription(String description){ 
     this.description = description; 
    } 

    public String getDescription(){ 
     return this.description; 
    } 

    public void setLink(String link){ 
     this.link = link; 
    } 

    public String getLink(){ 
     return this.link; 
    } 

    public void setUrl(String url){ 
     this.url = url; 
    } 

    public String getUrl(){ 
     return this.url; 
    } 

    public void setLanguage(String language){ 
     this.language = language; 
    } 

    public String getLanguage(){ 
     return this.language; 
    } 

    public void setRating(String rating){ 
     this.rating = rating; 
    } 

    public String getRating(){ 
     return this.rating; 
    } 

    public Date getPubDate() { 
     return pubDate; 
    } 

    public void setPubDate(Date pubDate) { 
     this.pubDate = pubDate; 
    } 

    public Date getLastBuildDate() { 
     return lastBuildDate; 
    } 

    public void setLastBuildDate(Date lastBuildDate) { 
     this.lastBuildDate = lastBuildDate; 
    } 

    public Date getDateModified() { 
     return dateModified; 
    } 

    public void setDateModified(Date dateModified) { 
     this.dateModified = dateModified; 
    } 

    public Date getDateCreated() { 
     return dateCreated; 
    } 

    public void setDateCreated(Date dateCreated) { 
     this.dateCreated = dateCreated; 
    } 

    public Collection getRssItems() { 
     return rssItems; 
    } 

    public void setRssItems(Collection rssItems) { 
     this.rssItems = rssItems; 
    } 
} 

public class RSSItem { 

    private RSS rss; 

    private Integer id; 
    private String title; 
    private String description; 
    private String link; 
    private Date dateCreated; 
    private Date dateModified; 
    private int rss_id; 

    public RSSItem() {} 

    public Integer getId() { 
     return id; 
    } 

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

    public String getTitle() { 
     return title; 
    } 

    public void setTitle(String title) { 
     this.title = title; 
    } 

    public String getDescription() { 
     return description; 
    } 

    public void setDescription(String description) { 
     this.description = description; 
    } 

    public String getLink() { 
     return link; 
    } 

    public void setLink(String link) { 
     this.link = link; 
    } 

    public Date getDateCreated() { 
     return dateCreated; 
    } 

    public void setDateCreated(Date dateCreated) { 
     this.dateCreated = dateCreated; 
    } 

    public Date getDateModified() { 
     return dateModified; 
    } 

    public void setDateModified(Date dateModified) { 
     this.dateModified = dateModified; 
    } 

    public RSS getRss() { 
     return rss; 
    } 

    public void setRss(RSS rss) { 
     this.rss = rss; 
    } 
} 

, что я отображенные в

<hibernate-mapping> 
    <class name="com.rssFeed.domain.RSS" schema="PUBLIC" table="RSS"> 
    <id name="id" type="int"> 
     <column name="ID"/> 
     <generator class="native"/> 
    </id> 
    <property name="title" type="string"> 
     <column name="TITLE" not-null="true"/> 
    </property>   
    <property name="lastBuildDate" type="java.util.Date"> 
     <column name="LASTBUILDDATE"/> 
    </property> 
    <property name="pubDate" type="java.util.Date"> 
     <column name="PUBDATE" /> 
    </property> 
    <property name="dateCreated" type="java.util.Date"> 
     <column name="DATECREATED" not-null="true"/> 
    </property> 
    <property name="dateModified" type="java.util.Date"> 
     <column name="DATEMODIFIED" not-null="true"/> 
    </property> 
    <property name="description" type="string"> 
     <column name="DESCRIPTION" not-null="true"/> 
    </property> 
    <property name="link" type="string"> 
     <column name="LINK" not-null="true"/> 
    </property> 
    <property name="url" type="string"> 
     <column name="URL" not-null="true"/> 
    </property> 
    <property name="language" type="string"> 
     <column name="LANGUAGE" not-null="true"/> 
    </property> 
    <property name="rating" type="string"> 
     <column name="RATING"/> 
    </property> 
    <set inverse="true" lazy="false" name="rssItems"> 
     <key> 
     <column name="RSS_ID"/> 
     </key> 
     <one-to-many class="com.rssFeed.domain.RSSItem"/> 
    </set> 
    </class> 
</hibernate-mapping> 


<hibernate-mapping> 
    <class name="com.rssFeed.domain.RSSItem" schema="PUBLIC" table="RSSItem"> 
    <id name="id" type="int"> 
     <column name="ID"/> 
     <generator class="native"/> 
    </id> 
    <property name="title" type="string"> 
     <column name="TITLE" not-null="true"/> 
    </property> 
    <property name="description" type="string"> 
     <column name="DESCRIPTION" not-null="true"/> 
    </property> 
    <property name="link" type="string"> 
     <column name="LINK" not-null="true"/> 
    </property> 
    <property name="dateCreated" type="java.util.Date"> 
     <column name="DATECREATED"/> 
    </property> 
    <property name="dateModified" type="java.util.Date"> 
     <column name="DATEMODIFIED"/> 
    </property> 
    <many-to-one class="com.rssFeed.domain.RSS" fetch="select" name="rss"> 
     <column name="RSS_ID"/> 
    </many-to-one> 
    </class> 
</hibernate-mapping> 

Но когда я пытаюсь принести RSS-я получаю следующую ошибку

Exception произошел в целевой виртуальной машине: не удалось лениво инициализировать коллекцию роли: com.rssFeed.domain.RSS.rssItems, сеанс или сеанс не закрыты org.hibernate.LazyInitializationException: не удалось лениво инициализировать коллекцию роли: com.rssFeed.domain.RSS.rssItems, сеанс или сеанс не закрыты at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException (AbstractPersistentCollection.java:358) на org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected (AbstractPersistentCollection.java:350) в org.hibernate.collection.AbstractPersistentCollection.readSize (AbstractPersistentCollection.java:97) в org.hibernate.collection.PersistentSet.size (PersistentSet. java: 139) at com.rssFeed.dao.hibernate.HibernateRssDao.get (HibernateRssDao.java:47) at com.rssFeed.ServiceImplementation.RssServiceImplementation.get (RssServiceImplementation.java:46)на com.rssFeed.mvc.ViewRssController.handleRequest (ViewRssController.java:20) в org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle (SimpleControllerHandlerAdapter.java:48) в org.springframework.web.servlet. DispatcherServlet.doDispatch (DispatcherServlet.java:875) at org.springframework.web.servlet.DispatcherServlet.doService (DispatcherServlet.java:809) at org.springframework.web.servlet.FrameworkServlet.processRequest (FrameworkServlet.java:476) на org.springframework.web.servlet.FrameworkServlet.doGet (FrameworkServlet.java:431) в javax.servlet.http.HttpServlet.service (HttpServlet.java:734) в javax.servlet.http.HttpServlet.service (HttpServlet.java:847) at org.apache.catalina. core.StandardWrapper.service (StandardWrapper.java:1523) at org.apache.catalina.core.StandardWrapperValve.invoke (StandardWrapperValve.java:279) at org.apache.catalina.core.StandardContextValve.invoke (StandardContextValve.java: 188) на org.apache.catalina.core.StandardPipeline.invoke (StandardPipeline.java:641) на com.sun.enterprise.web.WebPipeline.invoke (WebPipeline.java:97) на com.sun.enterprise. web.PESessionLockingStandardPipeline.invoke (PESessionLockingStandardPipeline.java:85) на org.apache.catalina.core.StandardHostValve.invoke (StandardHostValve.java:185) на org.apache.catalina.connector.CoyoteAdapter.doService (CoyoteAdapter.java: 332) at org.apache.catalina.connector.CoyoteAdapter.service (CoyoteAdapter.java:233) at com.sun.enterprise.v3.services.impl.ContainerMapper.service (ContainerMapper.java:165) at com.sun.grizzly.http.ProcessorTask.invokeAdapter (ProcessorTask.java:791) at com.sun. grizzly.http.ProcessorTask.doProcess (ProcessorTask.java:693) at com.sun.grizzly.http.ProcessorTask.process (ProcessorTask.java:954) at com.sun.grizzly.http.DefaultProtocolFilter.execute (DefaultProtocolFilter. Java: 170) на com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter (DefaultProtocolChain.java:135) в com.sun.grizzly.DefaultProtocolChain.execute (DefaultProtocolChain.java:102) в com.sun.grizzly.DefaultProtocolChain. выполнить (DefaultProtocolChain.java:88) на com.sun.grizzly.http.HttpProtocolChain.execute (HttpProtocolChain.Java: 76) в com.sun.grizzly.ProtocolChainContextTask.doCall (ProtocolChainContextTask.java:53) на com.sun.grizzly.SelectionKeyContextTask.call (SelectionKeyContextTask.java:57) на com.sun.grizzly.ContextTask. run (ContextTask.java:69) at com.sun.grizzly.util.AbstractThreadPool $ Worker.doWork (AbstractThreadPool.java:330) at com.sun.grizzly.util.AbstractThreadPool $ Worker.run (AbstractThreadPool.java: 309) на java.lang.Thread.run (Thread.java:619) <

что это значит?

Благодаря

я модифицировал свой код в соответствии с предложением от Pascal Thivent

и теперь я получаю следующее исключение

type Exception report 

message 

descriptionThe server encountered an internal error() that prevented it from fulfilling this request. 

exception 

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessResourceUsageException: could not initialize a collection: [com.rssFeed.domain.RSS.rssItems#3]; nested exception is org.hibernate.exception.SQLGrammarException: could not initialize a collection: [com.rssFeed.domain.RSS.rssItems#3] 

root cause 

org.springframework.dao.InvalidDataAccessResourceUsageException: could not initialize a collection: [com.rssFeed.domain.RSS.rssItems#3]; nested exception is org.hibernate.exception.SQLGrammarException: could not initialize a collection: [com.rssFeed.domain.RSS.rssItems#3] 

root cause 

org.hibernate.exception.SQLGrammarException: could not initialize a collection: [com.rssFeed.domain.RSS.rssItems#3] 

root cause 

java.sql.SQLException: Table not found in statement [select rssitems0_.RSS_ID as RSS7_1_, rssitems0_.ID as ID1_, rssitems0_.ID as ID2_0_, rssitems0_.TITLE as TITLE2_0_, rssitems0_.DESCRIPTION as DESCRIPT3_2_0_, rssitems0_.LINK as LINK2_0_, rssitems0_.DATECREATED as DATECREA5_2_0_, rssitems0_.DATEMODIFIED as DATEMODI6_2_0_, rssitems0_.RSS_ID as RSS7_2_0_ from PUBLIC.RSSItem rssitems0_ where rssitems0_.RSS_ID=?] 

note The full stack traces of the exception and its root causes are available in the GlassFish v3 logs. 

только если я удалить = LazyLoad «ложное» Я получить предыдущую ошибку

, кстати, это мои определения в таблице

drop table RSS_ITEM if exists 
drop table RSS if exists 

create table RSS (
    id integer identity primary key, 
    title varchar(128) not null, 
    description varchar(2048) not null, 
    link varchar(1024) not null, 
    url varchar(1024) not null, 
    language varchar(63) not null, 
    rating varchar(63), 
    pubDate date, 
    lastBuildDate date, 
    user_id integer, 
    dateCreated date not null, 
    dateModified date not null 
); 


create table RSS_ITEM (
    id integer identity primary key, 
    title varchar(128) not null, 
    description varchar(2048) not null, 
    link varchar(1024) not null, 
    rss_id integer not null, 
    dateCreated date not null, 
    dateModified date not null 
); 


alter table RSS_ITEM add constraint item_rss foreign key (rss_id) references RSS; 
alter table RSS add constraint rss_user foreign key (user_id) references RSS_USER; 
+0

'java.sql.SQLException: Таблица не найдена в инструкции ...' Похоже, что таблица 'RSSItem' не существует. –

ответ

0

В основном, при попытке доступа к загружаемому ресурсу и сеансу Hibernate сессия уже закрыта (поэтому свойство не может быть загружено, следовательно исключение). Это как раз то, что трассировка сообщает о свойстве rssItems.

нечетная частью является то, что вы отметили это свойство с lazy="false" и в соответствии с документацией, это отключает ленивую выборку и определяете, что ассоциация всегда охотно неправдоподобный так rssItems должен получить жадно неправдоподобным, и вы не должны получить LazyInitializationException.

Это, как говорится, я не уверен отображение правильно, я не уверен, что вы можете использовать <set> при сопоставлении java.util.Collection. Я не мог найти официальную ссылку, но если я хорошо помню, вы должны использовать <bag> для отображения Collection. Таким образом, вы можете попробовать либо:

  • изменить тип rssItems собственности в java.util.Set ~ или ~
  • изменить ваше отображение использовать <bag>

После этого, проверьте, если rssItems прибудете с нетерпением загружен, как и ожидалось, когда вы извлекаете объект RSS (активировать ведение журнала Hibernate SQL было бы полезно здесь).

+0

Да, я тоже хотел бы получить RssItems все время.Я попробую ваше предложение спасибо – GigaPr

+0

Что касается таблицы, вы правы, она была написана с ошибкой, но я все равно получаю сообщение об ошибке. Сеанс или сессия не были закрыты. – GigaPr

+0

Когда я отлаживаю и просматриваю объект Rss, Rssitem определяется как PersistentBag, и он продолжает оценивать и через какое-то время он исключает исключение – GigaPr

0

Ваша таблица с именем RSS_ITEM в БД, но спящий режим ищет RSSItem в запросе SQL (ошибка проверки). Вам нужно исправить имя таблицы при сопоставлении. Обратитесь к отображению 2-го класса в hbm XML. Имя таблицы должно быть здесь RSS_ITEM.

Смежные вопросы