2010-06-01 90 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我收到以下错误

异常发生在目标虚拟机:未能懒惰地初始化一个角色集合: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) 在org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:809) 在org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:476) at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:431) at javax.servlet.http.HttpServlet.service(HttpServlet.java:734) at 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) at com.sun.enterprise com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:97) org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:641) 。 web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:85) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:185) at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java: (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) at 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。运行(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) <

这是什么意思?

感谢

我已经根据从帕斯卡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:Table not found in statement ...'它看起来像表'RSSItem'不存在。 – 2010-06-01 21:53:24

回答

0

基本上,当您尝试访问延迟加载的属性并且Hibernate Session已关闭(因此该属性无法加载,因此是例外)时,会引发LazyInitializationException。这正是跟踪报告有关rssItems财产的原因。

奇怪的是,你标记这个属性lazy="false"并根据文档,这禁止延迟抓取,并指定一直使用预先抓取所以rssItems应该得到预先抓取,你不应该得到一个LazyInitializationException

话虽这么说,我不肯定的映射是正确的,我不知道映射java.util.Collection时,你可以使用一个<set>。我找不到官方的参考资料,但是如果我没记错的话,您应该使用<bag>来映射Collection。所以,可以尝试两种:

  • 变化rssItems财产为java.util.Set类型〜或〜
  • 改变你的映射使用<bag>

一旦完成,检查rssItems GET当您检索一个RSS实体时(如果激活Hibernate SQL日志记录在这里会很有帮助),按预期急切加载。

+0

是的,我想获取RssItems以及所有的时间。我会尝试您的建议 谢谢 – GigaPr 2010-06-01 21:34:46

+0

关于表是正确的它拼写错误,但我仍然得到错误没有会话或会话被关闭 – GigaPr 2010-06-01 22:17:01

+0

当我调试,我看着Rss对象Rssitem被定义为PersistentBag,它不断评估并在一段时间后抛出异常没有会话 – GigaPr 2010-06-01 22:21:24

0

您的表在数据库中名为RSS_ITEM,但hibernate正在SQL查询中查找RSSItem(检查错误)。您需要在映射中修复表名。请参阅hbm XML中的第二类映射。这里的表名应该是RSS_ITEM。