it-swarm.com.de

org.hibernate.MappingException: Typ konnte nicht bestimmt werden für: Java.util.List, bei Tabelle: College, für Spalten: [org.hibernate.mapping.Column (students)]

Jetzt lerne ich den Winterschlaf und benutze ihn in meinem Projekt. Es ist eine CRUD-Anwendung. Ich habe den Ruhezustand für alle Rohoperationen verwendet. Es funktioniert für alle. Aber ich bin es leid, es zu versuchen. Schließlich gibt es mir den folgenden Fehler.

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

Dann ging ich wieder durch dieses Video-Tutorial . Am Anfang ist es für mich sehr einfach. Aber ich kann es nicht zum Laufen bringen. Es heißt auch jetzt

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

Ich habe einige Suchanfragen im Internet durchgeführt. Dort hat jemand gesagt, es ist ein Fehler im Ruhezustand , und einige sagen, durch Hinzufügen von @GenereatedValue wird dieser Fehler behoben. Aber nichts funktioniert für mich,

Ich hoffe, ich bekomme eine Lösung !!

Vielen Dank!

Hier mein Code:

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


}

Konsole:

 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)

Die 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

Sie verwenden Feldzugriffsstrategie (bestimmt durch @Id-Annotation). Platzieren Sie eine JPA-bezogene Anmerkung direkt über jedem Feld anstelle der Getter-Eigenschaft

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

Durch das Hinzufügen des @ElementCollection zum Feld "Liste" wurde dieses Problem behoben:

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

Problem mit Zugriffsstrategien

Als JPA-Anbieter kann Hibernate die Entitätsattribute (Instanzfelder) oder die Accessoren (Instanzeigenschaften). Standardmäßig, Die Platzierung der @Id-Annotation gewährt den Standardzugriff Strategie. Bei der Platzierung in einem Feld geht der Ruhezustand feldbasiert von .__ aus. Zugriff. Hibernate wird auf dem Bezeichner-Getter platziert und verwendet Immobilienbasierter Zugang.

Feldbasierter Zugriff

Wenn Sie feldbasierten Zugriff verwenden, ist das Hinzufügen anderer Methoden auf Entitätsebene viel flexibler, da Hibernate diesen Teil des Persistenzstatus nicht berücksichtigt

@Entity
public class Simple {

@Id
private Integer id;

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

//getter +setter
}

Eigenschaftsbasierter Zugriff

Bei der Verwendung des Eigenschaftsbasierten Zugriffs verwendet Hibernate die Zugriffsmethoden zum Lesen und Schreiben des Entitätsstatus

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

}

Sie können jedoch nicht gleichzeitig den feldbasierten und den objektbasierten Zugriff verwenden. Es wird wie dieser Fehler für Sie angezeigt

Für mehr Idee folge das

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

Ich habe die gleichen Probleme, ich habe es durch Hinzufügen von @Access(AccessType.PROPERTY) gelöst.

6
user2406031

Ich bin zwar neu im Winterschlaf, aber mit wenig Forschung (Versuch und Irrtum können wir sagen). Ich fand heraus, dass dies auf Inkonsistenzen bei der Annotation der Methoden/Dateien zurückzuführen ist.

wenn Sie @ID für Variable mit Annotationen versehen, stellen Sie sicher, dass alle anderen Annotationen auch nur für Variable .__ ausgeführt werden. Wenn Sie Annotationen mit Getter-Methoden vornehmen, stellen Sie sicher, dass Sie nur alle anderen Getter-Methoden und nicht ihre jeweiligen Variablen kommentieren. 

0
sid

Mach dir keine Sorgen! Dieses Problem tritt aufgrund der Anmerkung auf. Statt des feldbasierten Zugriffs löst der Property-basierte Zugriff dieses Problem. Der Code wie folgt:

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