2016-11-03 24 views
0

1注釈外部キーjavax.el.E​​LExceptionに休止多く:私は1つのマッピングへの多くと2クラス持っ

カートクラス:

@Entity 
@Table(name = "Cart") 
public class Cart { 

@Id 
@Column(name = "ID", nullable = false) 
private String id; 

@ManyToOne(fetch = FetchType.LAZY, targetEntity = User.class) 
@JoinColumn(name = "UserID", referencedColumnName = "ID") 
private User user; 
} 

Userクラス:

@Entity 
@Table(name = "User") 
public class User { 
@OneToMany(fetch = FetchType.LAZY, mappedBy = "user") 
private Set<Cart> carts = new HashSet<Cart>(); 
} 

カートのオブジェクトから外来キーを取得したときの問題です。常にエラーを返します。

<c:set var="cart" value='<%=CartDAO.getCart("CT00001")%>' /> 
<c:out value="${cart.user.id}" /> 

そして、私の問題:次のコードのように私は休止XMLマッピングを使用する場合

SEVERE: Servlet.service() for servlet [jsp] in context with path [/mavenHibernate] threw exception [javax.el.ELException: Error reading 'id' on type model.User_$$_jvst39a_3] with root cause 
org.hibernate.LazyInitializationException: could not initialize proxy - no Session 
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:147) 
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:260) 
at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:73) 
at model.User_$$_jvst39a_3.getId(User_$$_jvst39a_3.java) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
at java.lang.reflect.Method.invoke(Unknown Source) 
at javax.el.BeanELResolver.getValue(BeanELResolver.java:94) 
at org.apache.jasper.el.JasperELResolver.getValue(JasperELResolver.java:110) 
at org.apache.el.parser.AstValue.getValue(AstValue.java:169) 
at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:184) 
at org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.java:944) 
at org.apache.jsp.test_jsp._jspx_meth_c_005fout_005f0(test_jsp.java:209) 
at org.apache.jsp.test_jsp._jspService(test_jsp.java:176) 
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:443) 
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:385) 
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:329) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:230) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) 
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:108) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:620) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:349) 
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:784) 
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) 
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:802) 
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1452) 
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
at java.lang.Thread.run(Unknown Source) 

それは実現しませんでした。これを解決するのを手伝ってください。私は解決策を見つけることができません。

編集: そして、これはXMLマッピングのバージョンである:

Cart.hbm.xml:

<hibernate-mapping> 
<class name="model.Cart" table="CART"> 
    <id name="id" type="java.lang.String"> 
     <column name="ID" /> 
     <generator class="assigned" /> 
    </id> 
    <many-to-one name="user" class="model.User" fetch="select"> 
     <column name="USERID" /> 
    </many-to-one> 
    <set name="cartItems" table="CARTITEM" inverse="true" lazy="true" fetch="select"> 
     <key> 
      <column name="CARTID" /> 
     </key> 
     <one-to-many class="model.CartItem" /> 
    </set> 
</class> 
</hibernate-mapping> 

User.hbm.xml:

<hibernate-mapping> 
<class name="model.User" table="USER"> 
    <id name="id" type="java.lang.String"> 
     <column name="ID" /> 
     <generator class="assigned" /> 
    </id> 
    <set name="carts" table="CART" inverse="true" lazy="true" fetch="select"> 
     <key> 
      <column name="USERID" /> 
     </key> 
     <one-to-many class="model.Cart" /> 
    </set> 
</class> 
</hibernate-mapping> 

彼らは、同じクエリを作成します

xmlクエリ:

Hibernate: select cart0_.ID as ID1_2_, cart0_.USERID as USERID2_2_, cart0_.DATEADD as DATEADD3_2_, cart0_.ACTIVE as ACTIVE4_2_ from CART cart0_ where cart0_.ID=? 

注釈クエリ:

Hibernate: select cart0_.ID as ID1_2_, cart0_.Active as Active2_2_, cart0_.DateAdd as DateAdd3_2_, cart0_.UserID as UserID4_2_ from Cart cart0_ where cart0_.ID=? 

なぜ注釈クエリスロー例外とXMLクエリはしませんでしたか?私はまだこの問題の原因を知りません。

編集2:この解決方法を探したいだけです。

編集3:まだ解決策のためにさまよっています。

答えて

1

@ManyToOneの関係をFetchType.LAZYに設定しました。 ManyToOneがデフォルトでEAGERであるため、EAGERに変更するか、フェッチプロパティを完全に削除することをお勧めします。

+0

これは私が解決したいことです。 FetchType.Eagerを使用すると、ユーザーのすべてのフィールドが不必要に読み込まれます。特に私はuseridを使用したいときは、UserIdフィールドに格納します。しかし、cart.user.idを使用してアクセスすることはできません。 – ChartFlow

+0

あなたがそれを使うならば、それは不必要ではありません。しかし、それでもLAZYのままにしたい場合は、user.getIdを呼び出す前にcart.getUserを発行して、そのオブジェクトをhibernateがロードしてからそのフィールドにアクセスできるようにしなければなりません。 – veljkost

+0

私はより多くの情報を掲載しました。これがより明確になることを願っています。お手伝いありがとうございます。 – ChartFlow

関連する問題