在Hibernate中持久化整数数组列表会引发异常

在Hibernate中持久化整数数组列表会引发异常,hibernate,jsf-2,primefaces,Hibernate,Jsf 2,Primefaces,在我的应用程序(Primefaces+Hibernate+OracleDB)中,我试图将具有整数数组列表(ManageSID)的实体持久化到两个表中(arraylist将进入“details”表) 当试图使用web应用程序保存实体时,它抛出ClassCastException。但是,当我从主方法而不是从web应用程序调用“updateJobDescription”方法时,它可以正常工作 实体: @SuppressWarnings("serial") @Entity @Table(name = "

在我的应用程序(Primefaces+Hibernate+OracleDB)中,我试图将具有整数数组列表(ManageSID)的实体持久化到两个表中(arraylist将进入“details”表)

当试图使用web应用程序保存实体时,它抛出ClassCastException。但是,当我从主方法而不是从web应用程序调用“updateJobDescription”方法时,它可以正常工作

实体:

@SuppressWarnings("serial")
@Entity
@Table(name = "EMP_JOB_DESCRIPTION")
public class EmployeeInfo
{
public EmployeeInfo()
{
    manageesIds.add(new Integer(1));
    manageesIds.add(new Integer(1));
    manageesIds.add(new Integer(1));
    manageesIds.add(new Integer(1));
    manageesIds.add(new Integer(1));
    manageesIds.add(new Integer(1));
    manageesIds.add(new Integer(1));
}

@Id
@Column(name = "emp_no")
private Integer empNo;

public String getName()
{
    return name;
}

public void setName(String name)
{
    this.name = name;
}

public String getEmail()
{
    return email;
}

public void setEmail(String email)
{
    this.email = email;
}

public String getOfficialPosition()
{
    return officialPosition;
}

public void setOfficialPosition(String officialPosition)
{
    this.officialPosition = officialPosition;
}

@Column(name = "emp_national_id_no")
private String nationalIdNo;

@Column(name = "emp_jawal_phone")
private String mobile;

@Column(name = "emp_phone_ext")
private String extension;

@Column(name = "emp_onreal_job_type")
private Integer actualPositionId;

@Column(name = "emp_st_old_dest")
private Integer workDestination;

@Column(name = "emp_city")
private Integer cityId;

@Column(name = "emp_specialty_desc")
private String specialtyDesc;

@Column(name = "emp_duties_desc")
private String dutiesDesc;

@Column(name = "emp_mng_job_desc")
private Integer managerPositionId;

@Column(name = "emp_qualification")
private Integer qualificationId;

@Column(name = "emp_last_qualification")
private Integer lastQualificationId;

@Column(name = "emp_experience")
private String experience;

@Column(name = "emp_training")
private String training;

@Transient
private String name;
@Transient
private String email;
@Transient
private String officialPosition;

@ElementCollection
@CollectionTable(name = "emp_job_description_detail", joinColumns = @JoinColumn(name = "EMP_NO"))
@Column(name = "EMP_MNG_CHAIRED_JOB_DESC")
private List<Integer> manageesIds = new ArrayList<Integer>();
例外情况:

14:42:26,586 SEVERE [javax.faces.event] (http-localhost-127.0.0.1-8888-3) java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
at org.hibernate.type.descriptor.java.IntegerTypeDescriptor.unwrap(IntegerTypeDescriptor.java:36)
at org.hibernate.type.descriptor.sql.IntegerTypeDescriptor$1.doBind(IntegerTypeDescriptor.java:57)
at org.hibernate.type.descriptor.sql.BasicBinder.bind(BasicBinder.java:92)
at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:305)
at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:300)
at org.hibernate.type.AbstractSingleColumnStandardBasicType.nullSafeSet(AbstractSingleColumnStandardBasicType.java:57)
at org.hibernate.persister.collection.AbstractCollectionPersister.writeElement(AbstractCollectionPersister.java:811)
at org.hibernate.persister.collection.AbstractCollectionPersister.recreate(AbstractCollectionPersister.java:1201)
at org.hibernate.action.internal.CollectionRecreateAction.execute(CollectionRecreateAction.java:58)
at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:362)
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:354)
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:279)
at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:326)
at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:52)
at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1181)
at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:379)
at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101)
at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:175)
at com.kku.jd.persistence.PersistenceManager.closeSession(PersistenceManager.java:53)
at com.kku.jd.persistence.PersistenceManager.updateJobDescription(PersistenceManager.java:137)
at com.kku.jd.managedbeans.UpdateBean.updateJobDescription(UpdateBean.java:123)
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.apache.el.parser.AstValue.invoke(AstValue.java:262)
at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:278)
at javax.faces.event.MethodExpressionActionListener.processAction(MethodExpressionActionListener.java:153)
at javax.faces.event.ActionEvent.processListener(ActionEvent.java:88)
at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:769)
at javax.faces.component.UICommand.broadcast(UICommand.java:300)
at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794)
at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259)
at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:329)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248)
at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:77)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:280)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248)
at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:449)
at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:365)
at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)
at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)
at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:383)
at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:362)
at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:280)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248)
at com.kku.jd.filter.InitializeSessionFilter.doFilter(InitializeSessionFilter.java:46)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:280)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161)
at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:153)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:155)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:368)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:671)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:930)
at java.lang.Thread.run(Unknown Source)
更新:

下面是我如何从Main方法调用它:

public static void main(String[] args)
{
    EmployeeInfo empInfo = new EmployeeInfo();

    empInfo.setEmail("sary@gmail.com");
    empInfo.setEmpNo(7);
    empInfo.setMobile("5698535");
    empInfo.setName("Sary");
    empInfo.setOfficialPosition("Dev Manager");

    empInfo.setNationalIdNo("123456789");

    List<Integer> ids = new ArrayList<Integer>();
    ids.add(1);
    empInfo.setManageesIds(ids);
    updateJobDescription(empInfo);

}

如果将
managesID
绑定到基于组件(如
)而不明确指定将提交的
字符串
值转换为
整数的转换器,则可能会发生这种情况。这里有一个
List
属性,并且在运行时(EL运行时)不存在泛型类型,因此EL看到的只是一个简单的
List
。只要您没有明确指定转换器,EL就会假定它只是一个
列表

有两种解决方案:

  • 显式指定转换器。您可以使用JSF内置的IntegerConverter进行以下操作:

    <h:selectManyCheckbox ... converter="javax.faces.Integer">
    

  • 如果将
    managesID
    绑定到基于组件(如
    )而不明确指定将提交的
    字符串
    值转换为
    整数的转换器,则可能会发生这种情况。这里有一个
    List
    属性,并且在运行时(EL运行时)不存在泛型类型,因此EL看到的只是一个简单的
    List
    。只要您没有明确指定转换器,EL就会假定它只是一个
    列表

    有两种解决方案:

  • 显式指定转换器。您可以使用JSF内置的IntegerConverter进行以下操作:

    <h:selectManyCheckbox ... converter="javax.faces.Integer">
    

  • 您如何从主方法调用它,如何从web应用程序调用它?@user1983983问题更新为包含方法调用。您如何从主方法调用它,如何从web应用程序调用它?@user1983983问题更新为包含方法调用。我终于很荣幸从@BalusC:)得到了一个正确的答案。顺便说一句,我使用的是一个基于UISelectOne(不是UISelectMany)的组件。我知道你被问了很多这个问题,但是你是如何设法深入挖掘来找到这些答案的呢?不客气。我刚刚意识到了这些症状。顺便说一下,将
    列表
    绑定为
    UISelectOne
    值是很奇怪的,它只能直接获取一项。无论如何,很高兴我能帮上忙。实际上我的屏幕上有几个
    组件。它们中的每一个都绑定到
    列表中的不同元素
    。啊,对了,通过这样的索引
    {bean.manageesIds[0]}
    ?是的,那么你确实还需要一个转换器。是的,转换器解决了这个问题。谢谢。我终于荣幸地得到了@BalusC:)的回答,而且像往常一样是正确的。顺便说一句,我使用的是一个基于UISelectOne(不是UISelectMany)的组件。我知道你被问了很多这个问题,但是你是如何设法深入挖掘来找到这些答案的呢?不客气。我刚刚意识到了这些症状。顺便说一下,将
    列表
    绑定为
    UISelectOne
    值是很奇怪的,它只能直接获取一项。无论如何,很高兴我能帮上忙。实际上我的屏幕上有几个
    组件。它们中的每一个都绑定到
    列表中的不同元素
    。啊,对了,通过这样的索引
    {bean.manageesIds[0]}
    ?是的,那么你确实还需要一个转换器。是的,转换器解决了这个问题。谢谢
    public void updateJobDescription()
    {
        // save all entered info
        PersistenceManager.updateJobDescription(empInfo);
    
        // return navigation to first page
        wizard.setStep(FIRST_STEP);
    
    }
    
    <h:selectManyCheckbox ... converter="javax.faces.Integer">
    
    private Integer[] manageesIds;