Java:org.hibernate.PropertyAccessException同时调用setter和getter

时间:2014-06-07 08:28:52

标签: java hibernate hibernate-mapping restlet

我正在使用java restlet和Hibernate构建一个应用程序。

我有用户实体类,每当我调用http get时。 我收到了错误。

{
    "error": "20000:Hibernate Exception. : org.hibernate.PropertyAccessException: IllegalArgumentException occurred while calling setter of tecd.persistence.entity.User.idUser",
    "status": 500
}

这是我的实体类。

package tecd.persistence.entity;

import java.io.Serializable;
import java.sql.Timestamp;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

import org.json.JSONObject;

/**
 * @author Rohit
 * 
 */
@Entity
@Table(name = "user")
public class User implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "iduser", nullable = false, unique = true, length = 255)
    private String idUser;

    @Column(name = "name", nullable = true, length = 255)
    private String name;

    @Column(name = "username", nullable = false,unique = true, length = 255)
    private String userName;

    @Column(name = "password", nullable = false, length = 255)
    private String password;


    @Column(name = "contactFirstName", nullable = true, length = 255)
    private String contactFirstName;

    @Column(name = "contactLastName", nullable = true, length = 255)
    private String contactLastName;

    @Column(name = "contactEmail", nullable = true, length = 255)
    private String contactEmail;

    @Column(name = "contactMobile", nullable = true, length = 32)
    private String contactMobile;

    @Column(name = "contactPhone", nullable = true, length = 32)
    private String contactPhone;

    @Column(name = "contactAddress", nullable = true, columnDefinition = "MEDIUMTEXT")
    private String contactAddress;

    @Column(name = "status", nullable = false)
    private Integer status;

    @Column(name = "type", nullable = false)
    private Integer type;

    @Column(name = "createdDT", nullable = false)
    private Timestamp createdDate;

    @Column(name = "updatedDT", nullable = true)
    private Timestamp updatedDate;


    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append("idUser = ").append(this.idUser).append(",");
        sb.append("name = ").append(this.name).append(",");

        sb.append("username = ").append(this.userName).append(",");
        sb.append("password = ").append(this.password).append(",");

        sb.append("contactAddress = ").append(this.contactAddress).append(",");
        sb.append("contactEmail = ").append(this.contactEmail).append(",");
        sb.append("status = ").append(this.status).append(",");
        sb.append("type = ").append(this.type).append(",");
        sb.append("contactFirstName = ").append(this.contactFirstName)
                .append(",");
        sb.append("contactLastName = ").append(this.contactLastName)
                .append(",");
        sb.append("contactPhone = ").append(this.contactPhone).append(",");
        sb.append("contactMobile = ").append(this.contactMobile).append(",");
        sb.append("createdDate = ").append(this.createdDate).append(",");
        sb.append("updatedDate = ").append(this.updatedDate);
        return sb.toString();
    }

    public JSONObject toJSON() {

        try {
            JSONObject jsonObj = new JSONObject();
            jsonObj.put("iduser", this.idUser);
            jsonObj.put("username", this.userName);
            jsonObj.put("password", this.password);
            jsonObj.put("createdDate", this.createdDate);
            jsonObj.put("status", this.status.toString());
            jsonObj.put("type", this.type.toString());

            // These fields may have null values
            if (this.name != null)
                jsonObj.put("name", setValue(this.name));
            if (this.contactFirstName != null)
                jsonObj.put("contactFirstName", setValue(this.contactFirstName));
            if (this.contactLastName != null)
                jsonObj.put("contactLastName", setValue(this.contactLastName));
            if (this.contactAddress != null)
                jsonObj.put("contactAddress", setValue(this.contactAddress));
            if (this.contactPhone != null)
                jsonObj.put("contactPhone", setValue(this.contactPhone));
            if (this.contactMobile != null)
                jsonObj.put("contactMobile", setValue(this.contactMobile));
            if (this.contactEmail != null)
                jsonObj.put("contactEmail", setValue(this.contactEmail));
            if (this.updatedDate != null)
                jsonObj.put("updatedDate", setValue(this.updatedDate));
            if (this.contactPhone != null)
                jsonObj.put("contactPhone", setValue(this.contactPhone));
            if (this.contactAddress != null)
                jsonObj.put("contactAddress", setValue(this.contactAddress));
            System.out.println("business JSON object"+jsonObj);
            return jsonObj;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    public Object setValue(Object input) {

        Object fieldValue = ((input == null) ? JSONObject.NULL.toString()
                : input);
        return fieldValue;
    }

     public String getPassword() {
         return password;
     }

     public void setPassword(String password) {
         this.password = password;
   }    


    public String getUserName() {
        return userName ;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }



    public String getidUser() {
        return idUser;
    }

    public void setidUser(String idUser) {
        this.idUser = idUser;
    }

    public String getName() {
        return name;
    }

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

    public String getContactFirstName() {
        return contactFirstName;
    }

    public void setContactFirstName(String contactFirstName) {
        this.contactFirstName = contactFirstName;
    }

    public String getContactLastName() {
        return contactLastName;
    }

    public void setContactLastName(String contactLastName) {
        this.contactLastName = contactLastName;
    }

    public String getContactEmail() {
        return contactEmail;
    }

    public void setContactEmail(String contactEmail) {
        this.contactEmail = contactEmail;
    }

    public String getContactMobile() {
        return contactMobile;
    }

    public void setContactMobile(String contactMobile) {
        this.contactMobile = contactMobile;
    }

    public String getContactPhone() {
        return contactPhone;
    }

    public void setContactPhone(String contactPhone) {
        this.contactPhone = contactPhone;
    }

    public String getContactAddress() {
        return contactAddress;
    }

    public void setContactAddress(String contactAddress) {
        this.contactAddress = contactAddress;
    }

    public Integer getStatus() {
        return status;
    }

    public void setStatus(Integer status) {
        this.status = status;
    }

    public Integer getType() {
        return type;
    }

    public void setType(Integer type) {
        this.type = type;
    }

    public Timestamp getCreatedDate() {
        return createdDate;
    }

    public void setCreatedDate(Timestamp createdDate) {
        this.createdDate = createdDate;
    }

    public Timestamp getUpdatedDate() {
        return updatedDate;
    }

    public void setUpdatedDate(Timestamp updatedDate) {
        this.updatedDate = updatedDate;
    }

}

各个xml文件看起来像

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="tecd.persistence.entity.User" table="user">    
    <id name="idUser" type="long" unsaved-value="null">
        <column name="idUser" not-null="true"/>
        <generator class="identity"/>
    </id>
        <property name="userName">
            <column name="username" not-null="true" />
        </property>
        <property name="password">
            <column name="password" not-null="true" />
        </property>     
        <property name="status">
            <column name="status" not-null="true" />
        </property>
        <property name="type">
            <column name="type" not-null="true" />
        </property>
        <property name="createdDate">
            <column name="createdDT" not-null="true" />
        </property>
        <property name="updatedDate">
            <column name="updatedDT" not-null="false" />
        </property>
        <property name="name">
            <column name="name" length="255" not-null="false" />
        </property>
        <property name="contactFirstName">
            <column name="contactFirstName" length="255" not-null="false" />
        </property>
        <property name="contactLastName">
            <column name="contactLastName" length="255" not-null="false" />
        </property>
        <property name="contactEmail">
            <column name="contactEmail" length="255" not-null="false" />
        </property>
        <property name="contactMobile">
            <column name="contactMobile" length="32" not-null="false" />
        </property>     
        <property name="contactPhone">
            <column name="contactPhone" length="32" not-null="false" />
        </property>     
        <property name="contactAddress">
            <column name="contactAddress" not-null="false" />
        </property>     

    </class>
</hibernate-mapping>

请建议我这里有什么问题。是否有任何java版本问题或我无法解决此问题。

Mysql表看起来像

CREATE TABLE `user` (
  `idUser` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(255) DEFAULT NULL,
  `password` varchar(255) DEFAULT NULL,
  `name` varchar(255) DEFAULT NULL,
  `contactFirstName` varchar(255) DEFAULT NULL,
  `contactLastName` varchar(255) DEFAULT NULL,
  `contactEmail` varchar(255) DEFAULT NULL,
  `contactMobile` varchar(32) DEFAULT NULL,
  `contactPhone` varchar(32) DEFAULT NULL,
  `contactAddress` mediumtext,
  `status` int(11) NOT NULL,
  `type` int(11) NOT NULL,
  `createdDT` datetime NOT NULL,
  `updatedDT` datetime DEFAULT NULL,
  PRIMARY KEY (`idUser`)
)

错误:

org.hibernate.PropertyAccessException: IllegalArgumentException occurred while calling setter of tecd.persistence.entity.User.idUser
    at org.hibernate.property.BasicPropertyAccessor$BasicSetter.set(BasicPropertyAccessor.java:104)
    at org.hibernate.tuple.entity.AbstractEntityTuplizer.setIdentifier(AbstractEntityTuplizer.java:211)
    at org.hibernate.tuple.entity.AbstractEntityTuplizer.instantiate(AbstractEntityTuplizer.java:353)
    at org.hibernate.persister.entity.AbstractEntityPersister.instantiate(AbstractEntityPersister.java:3600)
    at org.hibernate.impl.SessionImpl.instantiate(SessionImpl.java:1275)
    at org.hibernate.impl.SessionImpl.instantiate(SessionImpl.java:1264)
    at org.hibernate.loader.Loader.instanceNotYetLoaded(Loader.java:1290)
    at org.hibernate.loader.Loader.getRow(Loader.java:1197)
    at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:568)
    at org.hibernate.loader.Loader.doQuery(Loader.java:689)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
    at org.hibernate.loader.Loader.doList(Loader.java:2211)
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2095)
    at org.hibernate.loader.Loader.list(Loader.java:2090)
    at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:375)
    at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:338)
    at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:172)
    at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1121)
    at org.hibernate.impl.QueryImpl.list(QueryImpl.java:79)
    at tecd.persistence.UserDAO.viewUser(UserDAO.java:53)
    at tecd.resource.UserResource.viewUser(UserResource.java:64)
    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.restlet.resource.ServerResource.doHandle(ServerResource.java:503)
    at org.restlet.resource.ServerResource.get(ServerResource.java:707)
    at org.restlet.resource.ServerResource.doHandle(ServerResource.java:589)
    at org.restlet.resource.ServerResource.doNegotiatedHandle(ServerResource.java:649)
    at org.restlet.resource.ServerResource.doConditionalHandle(ServerResource.java:348)
    at org.restlet.resource.ServerResource.handle(ServerResource.java:952)
    at org.restlet.resource.Finder.handle(Finder.java:246)
    at org.restlet.routing.Filter.doHandle(Filter.java:159)
    at org.restlet.routing.Filter.handle(Filter.java:206)
    at org.restlet.routing.Router.doHandle(Router.java:431)
    at org.restlet.routing.Router.handle(Router.java:648)
    at org.restlet.routing.Filter.doHandle(Filter.java:159)
    at org.restlet.routing.Filter.handle(Filter.java:206)
    at org.restlet.routing.Filter.doHandle(Filter.java:159)
    at org.restlet.routing.Filter.handle(Filter.java:206)
    at org.restlet.routing.Filter.doHandle(Filter.java:159)
    at org.restlet.engine.application.StatusFilter.doHandle(StatusFilter.java:155)
    at org.restlet.routing.Filter.handle(Filter.java:206)
    at org.restlet.routing.Filter.doHandle(Filter.java:159)
    at org.restlet.routing.Filter.handle(Filter.java:206)
    at org.restlet.engine.CompositeHelper.handle(CompositeHelper.java:211)
    at org.restlet.engine.application.ApplicationHelper.handle(ApplicationHelper.java:84)
    at org.restlet.Application.handle(Application.java:381)
    at org.restlet.routing.Filter.doHandle(Filter.java:159)
    at org.restlet.routing.Filter.handle(Filter.java:206)
    at org.restlet.routing.Router.doHandle(Router.java:431)
    at org.restlet.routing.Router.handle(Router.java:648)
    at org.restlet.routing.Filter.doHandle(Filter.java:159)
    at org.restlet.routing.Filter.handle(Filter.java:206)
    at org.restlet.routing.Router.doHandle(Router.java:431)
    at org.restlet.routing.Router.handle(Router.java:648)
    at org.restlet.routing.Filter.doHandle(Filter.java:159)
    at org.restlet.engine.application.StatusFilter.doHandle(StatusFilter.java:155)
    at org.restlet.routing.Filter.handle(Filter.java:206)
    at org.restlet.routing.Filter.doHandle(Filter.java:159)
    at org.restlet.routing.Filter.handle(Filter.java:206)
    at org.restlet.engine.CompositeHelper.handle(CompositeHelper.java:211)
    at org.restlet.Component.handle(Component.java:392)
    at org.restlet.Server.handle(Server.java:516)
    at org.restlet.engine.connector.ServerConnectionHelper.handle(ServerConnectionHelper.java:257)
    at org.restlet.engine.connector.ServerConnectionHelper.doHandleInbound(ServerConnectionHelper.java:186)
    at org.restlet.engine.connector.BaseHelper$2.run(BaseHelper.java:593)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.IllegalArgumentException: argument type mismatch
    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.hibernate.property.BasicPropertyAccessor$BasicSetter.set(BasicPropertyAccessor.java:42)
    ... 69 more
2014-06-08  13:51:11    0:0:0:0:0:0:0:1 -   -   8100    GET /TECDRestService/user/Arohit    -   500 -   0   1907    http://localhost:8100   Mozilla/5.0 (Windows NT 6.3; WOW64; rv:29.0) Gecko/20100101 Firefox/29.0    -

2 个答案:

答案 0 :(得分:4)

您的idUser被定义为db中的long值。在您的对象中,它是String。请更改为Integer

答案 1 :(得分:1)

在Java @Entity用户中,idUser字段具有注释@GeneratedValue(strategy = GenerationType.AUTO)。这意味着Hibernate将在数据库级别生成唯一的INTEGER值,即它将分配一个从未在数据库中使用过的NUMBER,并且永远不会被回收。

因为您已将idUser设置为String类型,所以您将收到IllegalArgumentException。

请考虑以下代码:

@GeneratedValue(strategy = GenerationType.AUTO)
public void setIdUser(int idUser){
    this.idUser = "" + idUser;
}

public String getIdUser(){
    return this.idUser;
}

这将告诉hibernate使用提供的setter注入唯一id,并且setter将整数分配为String。

希望这有帮助!

修改

您还必须更改数据库架构,以接受字段idUser的VARCHAR类型。