Java Hibernate中的IllegaArgumentException

Java Hibernate中的IllegaArgumentException,java,hibernate,orm,illegalargumentexception,Java,Hibernate,Orm,Illegalargumentexception,我正在做一个简单的HibernateJava应用程序。我有两个主要的实体-学生和城市,通过多对一的关系联系在一起(许多学生可以来自同一个城市)。课程: @Entity @Table public class Student { @Id @GeneratedValue private int id; private int indexNumber; private String name; private String familyName;

我正在做一个简单的HibernateJava应用程序。我有两个主要的实体-学生和城市,通过多对一的关系联系在一起(许多学生可以来自同一个城市)。课程:

@Entity
@Table
public class Student {

    @Id
    @GeneratedValue
    private int id;


    private int indexNumber;
    private String name;
    private String familyName;
    private ArrayList <Float> marks;

    @ManyToOne
    private City city;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public City getCity() {
        return city;
    }

    public void setCity(City city) {
        this.city = city;
    }

    public ArrayList<Float> getMarks() {
        return marks;
    }

    public void setMarks(ArrayList<Float> marks) {
        this.marks = marks;
    }

    public Student(int indexNumber, String name, String familyName,
            ArrayList <Float> marks, City city) {       
        this.indexNumber = indexNumber;
        this.name = name;
        this.familyName = familyName;       
        this.marks = marks;
        this.city = city;

    }

    public Student(){

    }

    public int getIndexNumber() {
        return indexNumber;
    }

    public void setIndexNumber(int indexNumber) {
        this.indexNumber = indexNumber;
    }

    public String getName() {
        return name;
    }

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

    public String getFamilyName() {
        return familyName;
    }

    public void setFamilyName(String familyName) {
        this.familyName = familyName;
    }

    @Override
    public String toString()
    {
        return "Index number:"+indexNumber + "\t\t\tName:" + name +      "\t\t\tFamily name:" + familyName + "\t\t\tMark:"+ getMarks()+"\n";
        }
}

实际上,您的问题是由以下错误引起的:

Caused by: java.lang.IllegalArgumentException: argument type mismatch
请提供用于创建表的脚本,并再次检查列类型。 另外,将
mappedBy
添加到此

作为补充,请尝试将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="michal.task2.Student" table="Student" catalog="db">
        <id name="id" type="int">
            <column name="id" />
            <generator class="identity" />
        </id>
        <property name="indexNumber" type="int">
            <column name="indexNumber" not-null="true" unique="true" />
        </property>
        <property name="name" type="string">
            <column name="name" length="20" not-null="true"/>
        </property>
        <property name="familyName" type="string">
            <column name="familyName" length="20" not-null="true"/>
        </property>
        <list name="marks">
            <key column="mark" />
            <list-index column="index" />
            <element type="float"/>
        </list>
        <many-to-one name="city" class="michal.task2.City" fetch="select">
            <column name="city" not-null="true" />
        </many-to-one>
    </class>
</hibernate-mapping>
<?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="michal.task2.City" table="City" 
    catalog="db">
    <id name="cityId" type="int">
        <column name="cityId" />
        <generator class="identity" />
    </id>

    <property name="name" type="string">
        <column name="name" not-null="true"/>
    </property>
     <set name="students" table="Student" 
            inverse="true" lazy="true" fetch="select">
        <key>
            <column name="studentId" not-null="true" />
        </key>
        <one-to-many class="michal.task2.Student" />
    </set>
</class>
</hibernate-mapping>
public static void addStudent(Scanner sc) {

    System.out.println("Define parameters of the new Student.\n");
    System.out.println("Index number:\n");
    int index = sc.nextInt();
    System.out.println("Name:\n");
    sc.nextLine();
    String name = sc.nextLine();
    System.out.println("Family name:\n");
    String familyName = sc.nextLine();
    System.out.println("Marks:\n");
    ArrayList <Float> marks = new ArrayList <Float>();
    boolean go =  true;
    while(go){
        System.out.println("Enter mark:\n");
        float mark = sc.nextFloat();
        marks.add(mark);
        System.out.println("Add another mark? 1-yes/2-no\n");
        int choice = sc.nextInt();
        if(choice == 2) go = false;
    }
    sc.nextLine();
    System.out.println("City:\n");
    String cityName = sc.nextLine();
    City city = new City();
    city.setName(cityName);     
    Student student = new Student(index, name, familyName, marks, city);
    city.getStudents().add(student);
    session.beginTransaction();
    session.save(city); //this line
    session.save(student);      
    session.getTransaction().commit();
    System.out.println("Student added!\n");
}
Exception in thread "main" org.hibernate.PropertyAccessException: IllegalArgumentException occurred while calling setter of michal.task2.City.students
at org.hibernate.property.BasicPropertyAccessor$BasicSetter.set(BasicPropertyAccessor.java:119)
at org.hibernate.tuple.entity.AbstractEntityTuplizer.setPropertyValues(AbstractEntityTuplizer.java:707)
at org.hibernate.tuple.entity.PojoEntityTuplizer.setPropertyValues(PojoEntityTuplizer.java:371)
at org.hibernate.persister.entity.AbstractEntityPersister.setPropertyValues(AbstractEntityPersister.java:4232)
at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:283)
at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:195)
at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:128)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:204)
at org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:55)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:189)
at org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:49)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90)
at org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:642)
at org.hibernate.internal.SessionImpl.save(SessionImpl.java:635)
at org.hibernate.internal.SessionImpl.save(SessionImpl.java:631)
at michal.task2.Main.addStudent(Main.java:93)
at michal.task2.Main.menu(Main.java:41)
at michal.task2.Main.main(Main.java:26)
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:65)
... 17 more
Caused by: java.lang.IllegalArgumentException: argument type mismatch