JUnit报错

org.hibernate.PropertyAccessException: IllegalArgumentException occurred while calling setter of org.hibernate.beans.MemberPK.id
at org.hibernate.property.BasicPropertyAccessor$BasicSetter.set(BasicPropertyAccessor.java:128)
at org.hibernate.mapping.Component$ValueGenerationPlan.execute(Component.java:438)
at org.hibernate.id.CompositeNestedGeneratedValueGenerator.generate(CompositeNestedGeneratedValueGenerator.java:122)
at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:122)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210)
at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:56)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195)
at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:50)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)
at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:705)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:693)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:689)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:344)
at $Proxy11.save(Unknown Source)
at org.hibernate.test.CRUD.U(CRUD.java:44)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:46)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: java.lang.IllegalArgumentException: argument type mismatch
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.hibernate.property.BasicPropertyAccessor$BasicSetter.set(BasicPropertyAccessor.java:66)
... 42 more
Member.java:package org.hibernate.beans;import java.io.Serializable;
import java.sql.Blob;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;import javax.persistence.*;@Entity
@IdClass(MemberPK.class)
public class Member implements Serializable {
private Set<Article> articles = new HashSet<Article>();
private Date birthday;
private String bloodtype;
private String email;
private String hometown;
private Blob icon;
private Long id;
private String job;
private Integer level;
private String liveplace;
private Boolean married;
private String membername;
private String MSN;
private String pass;
// private MemberPK pk;
private Integer QQ;
private String realname;
private String resume;
private Integer sex;
private Integer tel; public Member() {
} @OneToMany(cascade = CascadeType.ALL, targetEntity = Article.class)
public Set<Article> getArticles() {
return articles;
} public Date getBirthday() {
return birthday;
} public String getBloodtype() {
return bloodtype;
} public String getEmail() {
return email;
} public String getHometown() {
return hometown;
} public Blob getIcon() {
return icon;
} @Id
@GeneratedValue
public Long getId() {
return id;
} public String getJob() {
return job;
} public Integer getLevel() {
return level;
} public String getLiveplace() {
return liveplace;
} public Boolean getMarried() {
return married;
} @Id
public String getMembername() {
return membername;
} public String getMSN() {
return MSN;
} @Id
public String getPass() {
return pass;
} public Integer getQQ() {
return QQ;
} public String getRealname() {
return realname;
} public String getResume() {
return resume;
} public Integer getSex() {
return sex;
} /*
 * public MemberPK getPk() { return pk; }
 */ public Integer getTel() {
return tel;
} public Boolean isMarried() {
return married;
} public void setArticles(Set<Article> articles) {
this.articles = articles;
} public void setBirthday(Date birthday) {
this.birthday = birthday;
} public void setBloodtype(String bloodtype) {
this.bloodtype = bloodtype;
} public void setEmail(String email) {
this.email = email;
} public void setHometown(String hometown) {
this.hometown = hometown;
} public void setIcon(Blob icon) {
this.icon = icon;
} public void setJob(String job) {
this.job = job;
} public void setId(Long id) { 
this.id = id; 
}
 
public void setLevel(Integer level) {
this.level = level;
} public void setLiveplace(String liveplace) {
this.liveplace = liveplace;
} public void setMarried(Boolean married) {
this.married = married;
} public void setMembername(String membername) {
this.membername = membername;
} public void setMSN(String MSN) {
this.MSN = MSN;
} public void setPass(String pass) {
this.pass = pass;
} public void setQQ(Integer QQ) {
this.QQ = QQ;
} /*
 * public void setPk(MemberPK pk) { this.pk = pk; }
 */ public void setRealname(String realname) {
this.realname = realname;
} public void setResume(String resume) {
this.resume = resume;
} public void setSex(Integer sex) {
this.sex = sex;
} public void setTel(Integer tel) {
this.tel = tel;
}
}
MemberPK.java:package org.hibernate.beans;import java.io.Serializable;import javax.persistence.Embeddable;
import javax.persistence.GeneratedValue;//@SuppressWarnings("serial")
//@Embeddable
public class MemberPK implements Serializable {
private Long id;
private String membername;
private String pass; @Override
public boolean equals(Object o) {
if (o instanceof MemberPK) {
MemberPK pk = (MemberPK) o;
if (this.id == pk.getId()
&& this.membername.equals(pk.getMembername())
&& this.pass.equals(pk.getPass())) {
return true;
}
}
return false;
} public Long getId() {
return id;
} public String getMembername() {
return membername;
} public String getPass() {
return pass;
} public int hashCode() {
return this.membername.hashCode();
} public void setId(Long id) {
this.id = id;
} public void setMembername(String membername) {
this.membername = membername;
} public void setPass(String pass) {
this.pass = pass;
}
}
测试单元代码:@Test
public void U() {
Member m = new Member();

Session session = sf.getCurrentSession();
session.beginTransaction();
m.setMembername("admin");
m.setPass("admin_pass");
session.save(m);
session.getTransaction().commit();

Session session1 = sf.getCurrentSession();
session1.beginTransaction();
m.setMembername("sonic");
m.setPass("sonic_pass");
session1.save(m);
session1.getTransaction().commit();
}
求解决办法……

解决方案 »

  1.   

    定义了Long类型的id,应该没有问题吧。
      

  2.   

    那把id定为Integer类型的吧,如果这都行,我也很纠结了
      

  3.   

    把id的类型改成Integer还是不行。
      

  4.   

    问题应该是产生的属性对应setXX方法中,出现“setAB()”这样的set后连续两个大写字母。
      

  5.   


    改成setAb()这样的形式之后依然不行。
      

  6.   


         @Id
        public String getMembername() {
            return membername;
        }    public String getMSN() {
            return MSN;
        }    @Id
        public String getPass() {
            return pass;
        }
    那么多都是ID啊?
      

  7.   

    用id,Membername,pass作联合主键。
      

  8.   

    今天我特别调试了一下MemberPK类的这个方法:        public void setId(Long id) {
    this.id = id;
    }发现执行完之后id仍然是NULL。
    这是什么情况?
      

  9.   

       定义Long类型的数据跟Int型的需要强转,不然就是会报错的,要改必须把数据库,映射文件、实体类、setter方法等的都要改过来,你在看看吧!要不就是很纠结!!!
      

  10.   

    已经定义了@IdClass(MemberPK.class)
    就不要再定义另外的PK了。
      

  11.   

    这个的话是仿造文档中的第三种写法。写这个@IdClass(MemberPK.class)的作用是为了确定Session缓存中的OID的类型,所以必须要写。
    不知道我理解的对不对,有不对的地方还请大家指出啊,谢谢了。
      

  12.   

    接分!
    j2se,jboss netty研究群15161096
      

  13.   

    这是文档中的写法:@Entity
    @IdClass(FootballerPk.class)
    public class Footballer {
        //part of the id key
        @Id public String getFirstname() {
            return firstname;
        }    public void setFirstname(String firstname) {
            this.firstname = firstname;
        }    //part of the id key
        @Id public String getLastname() {
            return lastname;
        }    public void setLastname(String lastname) {
            this.lastname = lastname;
        }    public String getClub() {
            return club;
        }    public void setClub(String club) {
            this.club = club;
        }    //appropriate equals() and hashCode() implementation
    }@Embeddable
    public class FootballerPk implements Serializable {
        //same name and type as in Footballer
        public String getFirstname() {
            return firstname;
        }    public void setFirstname(String firstname) {
            this.firstname = firstname;
        }    //same name and type as in Footballer
        public String getLastname() {
            return lastname;
        }    public void setLastname(String lastname) {
            this.lastname = lastname;
        }    //appropriate equals() and hashCode() implementation
    }
      

  14.   


    我想应该就是这里的空值造成的。
    我该怎样找到造成this.id = null的原因呢?