У меня есть 2 классов со многими до одного отображения:Hibernate многих один аннотаций внешнего ключа javax.el.ELException
Корзина класса:
@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;
}
класса Пользователь:
@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}" />
И моя проблема:
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. Пожалуйста, помогите мне исправить это. Я не могу найти решение.
Отредактировано: И это версия отображение 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 query:
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: по-прежнему блуждает по решению.
Вот что я хочу решить. Когда я использую FetchType.Eager, он будет загружать все поля пользователя без необходимости. Особенно, когда я только хочу использовать userid, он хранится в полях UserId. Но я не могу получить к нему доступ, используя cart.user.id. – ChartFlow
Это не лишнее, если вы его используете. Но если вы все еще хотите сохранить LAZY, вам нужно выдать cart.getUser до вызова user.getId, чтобы спящий режим загружал этот объект, а затем вы можете получить доступ к его полям. – veljkost
Я разместил дополнительную информацию. Надеюсь, это может сделать его более ясным. Спасибо за помощь. – ChartFlow