org.hibernate. - PullRequest
       4

org.hibernate.

74 голосов
/ 23 сентября 2010

Я использую 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>

Ответы [ 6 ]

137 голосов
/ 23 сентября 2010

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

@OneToMany(targetEntity=Student.class, mappedBy="college", fetch=FetchType.EAGER)
private List<Student> students;
55 голосов
/ 10 апреля 2013

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

    @Column
    @ElementCollection(targetClass=Integer.class)
    private List<Integer> countries;
24 голосов
/ 18 мая 2017

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

Как поставщик JPA, Hibernate может анализировать оба атрибута сущности. (поля экземпляра) или методы доступа (свойства экземпляра). По умолчанию, размещение аннотации @Id дает доступ по умолчанию стратегия. При размещении в поле Hibernate примет на основе поля доступ. Помещенный в идентификатор getter, 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;
}

}

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

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

6 голосов
/ 21 мая 2013
@Access(AccessType.PROPERTY)
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name="userId")
public User getUser() {
    return user;
}

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

0 голосов
/ 25 ноября 2018

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

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

0 голосов
/ 27 февраля 2017

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

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;
}

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...