如何解决org.hibernate.TypeMismatchException?

时间:2015-06-03 07:14:54

标签: java spring hibernate

我尝试使用spring mvc和hibernate开发一些服务器程序。 在我的表中,一些表有两个primray键。 所以,我想使用这些密钥。

简单地说,我使用了双@Id注释。

在结果中,我得到了org.hibernate.TypeMismatchException。 虽然我搜索解决错误,但我无法解决这个问题...... 请帮帮我。

这是我的模特课。

package kr.ac.jbnu.jinggumdari.model;

import java.io.Serializable;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.NaturalId;
import org.hibernate.annotations.Parameter;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

@Entity
@Table(name="festival_info")
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
public class Interest implements Serializable{
    @Id
    @Column(name="interest")
    private String interest;

    @Id
    @Column(name="festival_number", unique=true, nullable=false)
    @GeneratedValue(generator="gen")
    @GenericGenerator(name="gen", strategy="foreign", parameters=@Parameter(name="property", value="festival_info"))
    private String festivalNumber; 

    public Interest(){
        festivalNumber = "";
        interest = "";
    }
    public Interest(String festivalNumber, String interest) {
        this.festivalNumber = festivalNumber;
        this.interest = interest;
    }

    public String getFestivalNumber() {
        return festivalNumber;
    }
    public void setFestival_number(String festivalNumber) {
        this.festivalNumber = festivalNumber;
    }
    public String getInterest() {
        return interest;
    }
    public void setInterest(String interest) {
        this.interest = interest;
    }

    @Override
    public String toString(){
        return festivalNumber + "," + interest;
    }
}

这是我的servlet-context.xml。

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd">
    <!-- DispatcherServlet Context: defines this servlet's request-processing 
        infrastructure -->

    <!-- Enables the Spring MVC @Controller programming model -->
    <annotation-driven />

    <!-- Handles HTTP GET requests for /resources/** by efficiently serving 
        up static resources in the ${webappRoot}/resources directory -->
    <resources mapping="/resources/**" location="/resources/" />

    <!-- Resolves views selected for rendering by @Controllers to .jsp resources 
        in the /WEB-INF/views directory -->
    <beans:bean
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <beans:property name="prefix" value="/WEB-INF/views/" />
        <beans:property name="suffix" value=".jsp" />
    </beans:bean>

    <beans:bean
        class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
        <beans:property name="favorPathExtension" value="true" />
        <beans:property name="ignoreAcceptHeader" value="true" />

        <beans:property name="mediaTypes">
            <beans:map>
                <beans:entry key="json" value="application/json" />
                <beans:entry key="html" value="text/html" />
            </beans:map>
        </beans:property>
    </beans:bean>

    <context:component-scan base-package="kr.ac.jbnu.jinggumdari" />

    <beans:bean
        class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor" />

    <beans:bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close">
        <beans:property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <beans:property name="url"
            value="jdbc:mysql://localhost:3306/jinggumdari" />
        <beans:property name="username" value="root" />
        <beans:property name="password" value="mysql1234" />
    </beans:bean>

    <!-- Hibernate 4 SessionFactory Bean definition -->
    <beans:bean id="hibernate4AnnotatedSessionFactory"
        class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <beans:property name="dataSource" ref="dataSource" />
        <beans:property name="annotatedClasses">
            <beans:list>
                <beans:value>kr.ac.jbnu.jinggumdari.model.Member</beans:value>
                <beans:value>kr.ac.jbnu.jinggumdari.model.Festival</beans:value>
                <beans:value>kr.ac.jbnu.jinggumdari.model.FestivalImage</beans:value>
                <beans:value>kr.ac.jbnu.jinggumdari.model.Interest</beans:value>
            </beans:list>
        </beans:property>
        <beans:property name="hibernateProperties">
            <beans:props>
                <beans:prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect
                </beans:prop>
                <beans:prop key="hibernate.show_sql">true</beans:prop>
            </beans:props>
        </beans:property>
        <beans:property name="packagesToScan" value="com.hibernate.yourpackage" />
    </beans:bean>

    <beans:bean id="memberDAO" class="kr.ac.jbnu.jinggumdari.DAO.MemberDAOImpl">
        <beans:property name="sessionFactory"
            ref="hibernate4AnnotatedSessionFactory" />
    </beans:bean>
    <beans:bean id="memberService"
        class="kr.ac.jbnu.jinggumdari.serviceImplementation.MemberServiceImpl">
        <beans:property name="memberDAO" ref="memberDAO"></beans:property>
    </beans:bean>

    <beans:bean id="festivalDAO" class="kr.ac.jbnu.jinggumdari.DAO.FestivalDAOImpl">
        <beans:property name="sessionFactory"
            ref="hibernate4AnnotatedSessionFactory" />
    </beans:bean>
    <beans:bean id="festivalService"
        class="kr.ac.jbnu.jinggumdari.serviceImplementation.FestivalServiceImpl">
        <beans:property name="festivalDAO" ref="festivalDAO"></beans:property>
    </beans:bean>

    <beans:bean id="festivalImageDAO" class="kr.ac.jbnu.jinggumdari.DAO.FestivalImageDAOImpl">
        <beans:property name="sessionFactory"
            ref="hibernate4AnnotatedSessionFactory" />
    </beans:bean>
    <beans:bean id="festivalImageService"
        class="kr.ac.jbnu.jinggumdari.serviceImplementation.FestivalImageServiceImpl">
        <beans:property name="festivalImageDAO" ref="festivalImageDAO"></beans:property>
    </beans:bean>

    <beans:bean id="interestDAO" class="kr.ac.jbnu.jinggumdari.DAO.InterestDAOImpl">
        <beans:property name="sessionFactory"
            ref="hibernate4AnnotatedSessionFactory" />
    </beans:bean>
    <beans:bean id="interestService"
        class="kr.ac.jbnu.jinggumdari.serviceImplementation.InterestServiceImpl">
        <beans:property name="interestDAO" ref="interestDAO"></beans:property>
    </beans:bean>

    <beans:bean id="reviewDAO" class="kr.ac.jbnu.jinggumdari.DAO.ReviewDAOImpl">
        <beans:property name="sessionFactory"
            ref="hibernate4AnnotatedSessionFactory" />
    </beans:bean>
    <beans:bean id="reviewService"
        class="kr.ac.jbnu.jinggumdari.serviceImplementation.ReviewServiceImpl">
        <beans:property name="reviewDAO" ref="reviewDAO"></beans:property>
    </beans:bean>

    <tx:annotation-driven transaction-manager="transactionManager" />

    <beans:bean id="transactionManager"
        class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <beans:property name="sessionFactory"
            ref="hibernate4AnnotatedSessionFactory" />
    </beans:bean>
</beans:beans>

这是我的DAO。

package kr.ac.jbnu.jinggumdari.DAO;

import java.util.List;

import kr.ac.jbnu.jinggumdari.model.Interest;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.transaction.annotation.Transactional;

public class InterestDAOImpl implements InterestDAO {
    private static final Logger logger = LoggerFactory
            .getLogger(FestivalDAOImpl.class);
    private SessionFactory sessionFactory;
    private boolean isSuccess;

    public void setSessionFactory(SessionFactory sf) {
        this.sessionFactory = sf;
    }

    @Override
    @Transactional
    public boolean addInterest(Interest interest) {
        // TODO Auto-generated method stub
        isSuccess = false;
        Session session = this.sessionFactory.getCurrentSession();
        session.persist(interest);
        logger.info("Festival saved successfully, Festival Details=" + interest);
        isSuccess = true;
        return isSuccess;
    }

    @Override
    @Transactional
    public boolean modifyInterest(Interest interest) {
        // TODO Auto-generated method stub
        isSuccess = false;
        Session session = this.sessionFactory.getCurrentSession();
        session.update(interest);
        logger.info("Festival modified successfully, Festival Details="
                + interest);
        isSuccess = true;
        return isSuccess;
    }

    @Override
    @Transactional
    public boolean removeInterests(String festivalNumber) {
        // TODO Auto-generated method stub
        isSuccess = false;
        Session session = this.sessionFactory.getCurrentSession();
        Long numberOfInterests = getNumberOfInterests(festivalNumber, session);
        for (int i = 0; i < numberOfInterests; i++) {
            Interest targetInterest = (Interest) session.load(Interest.class,
                    festivalNumber);
            if (targetInterest != null) {
                session.delete(targetInterest);
            }
            logger.info("Interest deleted successfully, Interest details="
                    + targetInterest);
        }
        isSuccess = true;

        return isSuccess;
    }

    @Override
    @Transactional
    public List<Interest> getInterests(String festivalNumber) {
        // TODO Auto-generated method stub
        Session session = this.sessionFactory.getCurrentSession();
        List<Interest> interestsList = session.createQuery("from Interest")
                .list();
        for (Interest i : interestsList) {
            logger.info("Person List::" + i);
        }
        return interestsList;
    }

    @Transactional
    private Long getNumberOfInterests(String festivalNUmber, Session session) {
        String hql = "Select count(*) from Interest where festival_number='"
                + festivalNUmber + "'";
        List list = session.createQuery(hql).list();
        return (Long) list.get(0);
    }
}

这是错误堆栈。

org.hibernate.TypeMismatchException: Provided id of the wrong type for class kr.ac.jbnu.jinggumdari.model.Interest. Expected: class kr.ac.jbnu.jinggumdari.model.Interest, got class java.lang.String
    at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:134)
    at org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1106)
    at org.hibernate.internal.SessionImpl.access$2000(SessionImpl.java:176)
    at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.getReference(SessionImpl.java:2564)
    at org.hibernate.internal.SessionImpl.load(SessionImpl.java:981)
    at kr.ac.jbnu.jinggumdari.DAO.InterestDAOImpl.removeInterests(InterestDAOImpl.java:56)
    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 org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
    at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:281)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
    at com.sun.proxy.$Proxy54.removeInterests(Unknown Source)
    at kr.ac.jbnu.jinggumdari.serviceImplementation.InterestServiceImpl.removeInterests(InterestServiceImpl.java:31)
    at kr.ac.jbnu.jinggumdari.controller.JinggumdariController.test2(JinggumdariController.java:309)
    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 org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:777)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:706)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:943)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:877)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:857)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:624)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:423)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1079)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:620)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:318)
    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)

2 个答案:

答案 0 :(得分:1)

您不能对复合主键使用2 @Id注释。您必须使用@EmbeddedId检查此documentation和此Stackoverflow link

答案 1 :(得分:1)

您的问题是您在同一个实体中使用了两个@Id注释,而是宁愿使用@EmbeddeId,因此请更改此代码:

@Id
@Column(name="interest")
private String interest;

@Id
@Column(name="festival_number", unique=true, nullable=false)
@GeneratedValue(generator="gen")
@GenericGenerator(name="gen", strategy="foreign", parameters=@Parameter(name="property", value="festival_info"))
private String festivalNumber; 

以下代码:

public class Interest implements Serializable{

   @EmbeddedId
   private InterestId id;
   //getters and setters and the rest of your code go here

}

InterestId类:

@Embeddable
public class Person implements Serializable {
    private static final long serialVersionUID = 1L;

    @Column(name="interest")
    private String interest;

    @Column(name="festival_number", unique=true, nullable=false)
    @GeneratedValue(generator="gen")
    @GenericGenerator(name="gen", strategy="foreign", parameters=@Parameter(name="property", value="festival_info"))
    private String festivalNumber;

     // and getters and setters here
}

您可以参考this tutorial Documentation here 获取更多信息。