Я использую 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>
@Access(AccessType.FIELD)
(в моем случае я хотел использовать FIELD) было единственное, что решило эту проблемуОтветы:
Вы используете стратегию доступа к полю (определяется аннотацией @Id). Поместите любую аннотацию, связанную с JPA, прямо над каждым полем вместо свойства getter
@OneToMany(targetEntity=Student.class, mappedBy="college", fetch=FetchType.EAGER) private List<Student> students;
источник
object references an unsaved transient instance - save the transient instance before flushing
Вы знаете об этой ошибке. Если не просто оставь это. Я ищу.cascade=CascadeType.ALL
. Но для меня это показывает ошибку и никаких предложений в моем затмении. Вы что-нибудь знаете об этом. :)persistence.cascade
Теперь все очищено. Но я снова получаю старую ошибкуobject references an unsaved transient instance - save the transient instance before flushing
Любые предложения !!! : + |Добавление
@ElementCollection
поля в список решило эту проблему:@Column @ElementCollection(targetClass=Integer.class) private List<Integer> countries;
источник
targetClass
не обязательно, так как вы упомянули тип списка<Integer>
Проблема со стратегиями доступа
Полевой доступ
При использовании доступа на основе полей добавление других методов уровня сущности гораздо более гибкое, поскольку 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; } }
Но вы не можете использовать доступ как на основе полей, так и на основе свойств одновременно. Это покажет вам эту ошибку
Для получения дополнительной информации следуйте этому
источник
@Access(AccessType.PROPERTY) @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER) @JoinColumn(name="userId") public User getUser() { return user; }
У меня такие же проблемы, решил добавлением
@Access(AccessType.PROPERTY)
источник
@Access(AccessType.FIELD)
(в моем случае я хотел пойти с FIELD) было единственное, что решило эту проблемуНе волнуйтесь! Эта проблема возникает из-за аннотации. Вместо доступа на основе поля эту проблему решает доступ на основе свойств. Код следующий:
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; }
}
источник
Просто вставьте аннотацию @ElementCollection поверх переменной списка массивов, как показано ниже:
@ElementCollection private List<Price> prices = new ArrayList<Price>();
надеюсь, это поможет
источник
Хотя я новичок в спящем режиме, но с небольшим исследованием (можно сказать, методом проб и ошибок) я обнаружил, что это связано с несогласованностью в аннотировании методов / полей.
когда вы аннотируете @ID для переменной, убедитесь, что все другие аннотации также сделаны только для переменной, и когда вы аннотируете ее в методе получения, убедитесь, что вы аннотируете только все другие методы получения, а не их соответствующие переменные.
источник
На случай, если кто-то еще попадет сюда с той же проблемой, с которой я столкнулся. Я получал ту же ошибку, что и выше:
Hibernate использует отражение, чтобы определить, какие столбцы находятся в сущности. У меня был частный метод, который начинался с get и возвращал объект, который также был объектом гибернации. Даже частные геттеры, которые вы хотите, чтобы hibernate игнорировал, должны быть аннотированы @Transient. Как только я добавил аннотацию @Transient, все заработало.
@Transient private List<AHibernateEntity> getHibernateEntities() { .... }
источник
В моем случае было глупо пропустить аннотацию @OneToOne, я установил @MapsId без нее
источник