【问题标题】:Struts 2 HibernateStruts 2 休眠
【发布时间】:2013-12-04 18:56:09
【问题描述】:

我正在学习 Struts2 和 Hibernate...

我有一个客户类,其中包含与每个实例关联的地理代码。当我在 JSP 上显示时,我需要用标签分解每个字符。

    String geoCode = "1324567890";

需要成为

    List<String> geoCodeList = "[1][2][3]..."

这样我就可以在 JSP 中使用一个子集。

我试图做的是向我的 Customer.java 对象添加另一个属性。我有以下内容:

private String geoCode;
private List<String> geoCodeList;

@Column(name = "GEO_CD")
public String getGeoCd() {
    return geoCd;
}

public void setGeoCd(String geoCd) {
    this.geoCd = geoCd;

    geoCdList = new ArrayList<String>();

    System.out.println("geo length = " + geoCd.length());
    for (int i=0; i < geoCd.length(); i++) {
        geoCdList.add(geoCd.substring(i,i+1));          
    }
}

这一切都很好,但是一旦我为 geoCdList 添加了一个 getter 方法,我就会收到一个错误。

public List<String> getGeoCdList() {
    return geoCdList;
}

错误是:

    Initial SessionFactory creation failed.org.hibernate.MappingException: Could not determine     type for: java.util.List, at table: Customer, for columns: [org.hibernate.mapping.Column(geoCdList)]
    Dec 03, 2013 10:21:26 PM org.apache.catalina.core.StandardWrapperValve invoke
    SEVERE: Servlet.service() for servlet [default] in context with path [/msps-web] threw exception  [Filter execution threw an exception] with root cause
    org.hibernate.MappingException: Could not determine type for: java.util.List, at table: Customer, for columns: [org.hibernate.mapping.Column(geoCdList)]
at org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:306)
at org.hibernate.mapping.SimpleValue.isValid(SimpleValue.java:290)
at org.hibernate.mapping.Property.isValid(Property.java:243)
at org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:464)
at org.hibernate.mapping.RootClass.validate(RootClass.java:235)
at org.hibernate.cfg.Configuration.validate(Configuration.java:1362)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1865)
at com.att.msps.database.util.HibernateUtil.buildSessionFactory(HibernateUtil.java:13)
at com.att.msps.database.util.HibernateUtil.<clinit>(HibernateUtil.java:8)
at com.att.msps.customer.view.CustomerAction.<init>(CustomerAction.java:28)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
at java.lang.Class.newInstance(Class.java:374)
at com.opensymphony.xwork2.ObjectFactory.buildBean(ObjectFactory.java:131)
at com.opensymphony.xwork2.ObjectFactory.buildBean(ObjectFactory.java:162)
at com.opensymphony.xwork2.ObjectFactory.buildBean(ObjectFactory.java:151)
at com.opensymphony.xwork2.ObjectFactory.buildAction(ObjectFactory.java:121)
at com.opensymphony.xwork2.DefaultActionInvocation.createAction(DefaultActionInvocation.java:297)
at com.opensymphony.xwork2.DefaultActionInvocation.init(DefaultActionInvocation.java:397)
at com.opensymphony.xwork2.DefaultActionProxy.prepare(DefaultActionProxy.java:194)
at org.apache.struts2.impl.StrutsActionProxy.prepare(StrutsActionProxy.java:63)
at org.apache.struts2.impl.StrutsActionProxyFactory.createActionProxy(StrutsActionProxyFactory.java:39)
at com.opensymphony.xwork2.DefaultActionProxyFactory.createActionProxy(DefaultActionProxyFactory.java:58)
at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:553)
at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:99)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
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:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1002)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585)
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:724)

我的猜测是它认为它是桌子上的一列,但我不太确定。任何帮助将不胜感激。

谢谢!!!!!!

【问题讨论】:

    标签: hibernate struts2 hibernate-mapping


    【解决方案1】:

    在 Entity 中保留一个列表并且不要在数据库中映射它不是一个好主意。

    无论如何,您可以在该字段上使用@Transient 注释,它不会被持久化。

    【讨论】:

    • 如果这个字段没有保存在数据库中,那么 setter 中的逻辑就没有意义了。
    • @AleksandrM 这就是我从问题中推断出来的。他不想坚持,只是为了查看目的。
    • 也许吧。但是只有当这个列表被持久化时,setter 内部的逻辑才有意义。
    • Aleksandr & coding_idiot:我不认为它需要坚持下去。我一直在想如何在 JSP 中分解字符串,但我读到我应该在控制器中完成大部分工作,但我不知道如何从模型中获取该值,然后在控制器。使用 @Transient 有效,但有没有更好的方法来设计它?
    • 为什么不能在控制器中解析?
    【解决方案2】:

    如果要将geoCodeList 持久化到数据库,则需要使用@ElementCollection 注释将其映射为字符串集合。

    @ElementCollection
    private List<String> geoCodeList;
    

    但是,如果您不想保留列表,则需要将列表创建逻辑从 setter 方法移动到其他方法,并使用 @Transient 注释来注释此方法。

    【讨论】:

      【解决方案3】:

      不要为 geoCdList 添加任何注释。

      【讨论】:

      • 我没有任何注释。位置重要吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多