it-roy-ru.com

org.hibernate.MappingException: не удалось определить тип для: Java.util.List, в таблице: College, для выпускников: [org.hibernate.mapping.Column (Students)]

Сейчас я изучаю hibernate и начал использовать его в своем проекте. Это CRUD-приложение ... Я использовал hibernate для всех операций crud. Это работает для всех из них. Но, один-ко-многим и многие-к-одному, я устал от этого. Наконец это дает мне следующую ошибку.

org.hibernate.MappingException: Could not determine type for: Java.util.List, at table: College, for columns: [org.hibernate.mapping.Column(students)]

Затем я снова прошел этот видеоурок . Для меня это очень просто, в начале. Но я не могу заставить это работать. Это также сейчас, говорит

org.hibernate.MappingException: Could not determine type for: Java.util.List, at table: College, for columns: [org.hibernate.mapping.Column(students)]

Я провел несколько поисков в интернете, там кто-то говорит это ошибка в Hibernate , а некоторые говорят, добавив @GenereatedValue эта ошибка будет очищена. Но ничто не работает для меня,

Я надеюсь, что я получу некоторое исправление !!

Спасибо! 

Вот мой код:

College.Java

@Entity
public class College {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int collegeId;
private String collegeName;


private List<Student> students;

@OneToMany(targetEntity=Student.class, mappedBy="college", fetch=FetchType.EAGER)
public List<Student> getStudents() {
    return students;
}
public void setStudents(List<Student> students) {
    this.students = students;
}//Other gettters & setters omitted

Student.Java

@Entity
public class Student {


@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int studentId;
private String studentName;


private College college;

@ManyToOne
@JoinColumn(name="collegeId")
public College getCollege() {
    return college;
}
public void setCollege(College college) {
    this.college = college;
}//Other gettters & setters omitted

Main.Java:

public class Main {

private static org.hibernate.SessionFactory sessionFactory;

  public static SessionFactory getSessionFactory() {
    if (sessionFactory == null) {
      initSessionFactory();
    }
    return sessionFactory;
  }

  private static synchronized void initSessionFactory() {
    sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();

  }

  public static Session getSession() {
    return getSessionFactory().openSession();
  }

  public static void main (String[] args) {
                Session session = getSession();
        Transaction transaction = session.beginTransaction();
        College college = new College();
        college.setCollegeName("Dr.MCET");

        Student student1 = new Student();
        student1.setStudentName("Peter");

        Student student2 = new Student();
        student2.setStudentName("John");

        student1.setCollege(college);
        student2.setCollege(college);



        session.save(student1);
        session.save(student2);
        transaction.commit();
  }


}

Приставка:

 Exception in thread "main" org.hibernate.MappingException: Could not determine type  for: Java.util.List, at table: College, for columns:  [org.hibernate.mapping.Column(students)]
at org.hibernate.mapping.SimpleValue.getType(SimpleValue.Java:306)
at org.hibernate.mapping.SimpleValue.isValid(SimpleValue.Java:290)
at org.hibernate.mapping.Property.isValid(Property.Java:217)
at org.hibernate.mapping.PersistentClass.validate(PersistentClass.Java:463)
at org.hibernate.mapping.RootClass.validate(RootClass.Java:235)
at org.hibernate.cfg.Configuration.validate(Configuration.Java:1330)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.Java:1833)
at test.hibernate.Main.initSessionFactory(Main.Java:22)
at test.hibernate.Main.getSessionFactory(Main.Java:16)
at test.hibernate.Main.getSession(Main.Java:27)
at test.hibernate.Main.main(Main.Java:43)

XML:

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
    <!-- Database connection settings -->
    <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="connection.url">jdbc:mysql://localhost:3306/dummy</property>
    <property name="connection.username">root</property>
    <property name="connection.password">1234</property>
    <!-- JDBC connection pool (use the built-in) -->
    <property name="connection.pool_size">1</property>
    <!-- SQL dialect -->
    <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
    <!-- Enable Hibernate's automatic session context management -->
    <property name="current_session_context_class">thread</property>
    <!-- Disable the second-level cache -->
    <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
    <!-- Echo all executed SQL to stdout -->
    <property name="show_sql">true</property>
    <!-- Drop and re-create the database schema on startup -->
    <property name="hbm2ddl.auto">update</property>

    <mapping class="test.hibernate.Student" />
    <mapping class="test.hibernate.College" />
</session-factory>

72
user405398

Вы используете стратегия доступа к полю (определяется аннотацией @Id). Поместите любую связанную с JPA аннотацию прямо над каждым полем вместо свойства получателя

@OneToMany(targetEntity=Student.class, mappedBy="college", fetch=FetchType.EAGER)
private List<Student> students;
133
Arthur Ronald

Добавление @ElementCollection в поле List решило эту проблему:

    @Column
    @ElementCollection(targetClass=Integer.class)
    private List<Integer> countries;
51
Biggy_java2

Проблема с Стратегии доступа

Как поставщик JPA, Hibernate может анализировать оба атрибута сущности (поля экземпляра) или методы доступа (свойства экземпляра). По умолчанию, размещение аннотации @Id дает доступ по умолчанию стратегия. При размещении в поле Hibernate примет на основе поля доступ. Помещенный в метод получения идентификатора, Hibernate будет использовать имущественный доступ.

Полевой доступ

При использовании доступа на основе полей добавление других методов уровня объекта является гораздо более гибким, поскольку Hibernate не будет рассматривать эти части состояния постоянства.

@Entity
public class Simple {

@Id
private Integer id;

@OneToMany(targetEntity=Student.class, mappedBy="college", 
fetch=FetchType.EAGER)
private List<Student> students;

//getter +setter
}

Свойство доступа

При использовании доступа на основе свойств Hibernate использует средства доступа для чтения и записи состояния объекта.

@Entity
public class Simple {

private Integer id;
private List<Student> students;

@Id
public Integer getId() {
    return id;
}

public void setId( Integer id ) {
    this.id = id;
}
@OneToMany(targetEntity=Student.class, mappedBy="college", 
fetch=FetchType.EAGER)
public List<Student> getStudents() {
   return students;
}
public void setStudents(List<Student> students) {
    this.students = students;
}

}

Но вы не можете использовать доступ как на основе полей, так и на основе свойств одновременно. Это покажет вам эту ошибку

Для большей идеи следуйте это

21
Dev4World
@Access(AccessType.PROPERTY)
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name="userId")
public User getUser() {
    return user;
}

У меня такие же проблемы, я решил это, добавив @Access(AccessType.PROPERTY)

6
user2406031

Хотя я новичок в hibernate, но с небольшими исследованиями (методом проб и ошибок мы можем сказать) Я обнаружил, что это происходит из-за непоследовательности в аннотировании методов/полей.

когда вы аннотируете @ID для переменной, убедитесь, что все другие аннотации также выполняются только для переменной и когда вы аннотируете это для метода get, то же самое, убедитесь, что вы аннотируете только все другие методы getter, а не их соответствующие переменные. 

0
sid

Не волнуйся! Эта проблема возникает из-за аннотации. Вместо доступа на основе полей доступ на основе свойств решает эту проблему. Код следующим образом:

package onetomanymapping;

import Java.util.List;

import javax.persistence.*;

@Entity
public class College {
private int collegeId;
private String collegeName;
private List<Student> students;

@OneToMany(targetEntity = Student.class, mappedBy = "college", 
    cascade = CascadeType.ALL, fetch = FetchType.EAGER)
public List<Student> getStudents() {
    return students;
}

public void setStudents(List<Student> students) {
    this.students = students;
}

@Id
@GeneratedValue
public int getCollegeId() {
    return collegeId;
}

public void setCollegeId(int collegeId) {
    this.collegeId = collegeId;
}

public String getCollegeName() {
    return collegeName;
}

public void setCollegeName(String collegeName) {
    this.collegeName = collegeName;
}

}

0
aaron stone