У меня есть объект модели, который назвал Student_Info
в пакете com.hibernate
.
В том же пакете у меня есть класс Main, где я создал экземпляр Student_Info
:
public class Main {
public static void main(String[] args) {
Student_Info student = new Student_Info();
student.setRollNo(1);
student.setName("Ichigo");
SessionFactory sessionFactory =
new AnnotationConfiguration().configure().buildSessionFactory();
Session session = sessionFactory.openSession();
session.beginTransaction();
session.save(student);
session.getTransaction().commit();
session.close();
sessionFactory.close();
}
}
В файле hibernate.cfg.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/hibernatedb</property>
<property name="connection.username">root</property>
<property name="connection.password">toor</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 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.internal.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">create</property>
<mapping resource="com.hibernate.Student_Info" />
</session-factory>
</hibernate-configuration>
Но когда я запускаю класс Main, я получаю эту ошибку:
Exception in thread "main" org.hibernate.MappingNotFoundException: resource: com.hibernate.Student_Info not found
at org.hibernate.cfg.Configuration.addResource(Configuration.java:767)
at org.hibernate.cfg.AnnotationConfiguration.addResource(AnnotationConfiguration.java:123)
at org.hibernate.cfg.AnnotationConfiguration.addResource(AnnotationConfiguration.java:46)
at org.hibernate.cfg.Configuration.parseMappingElement(Configuration.java:2255)
at org.hibernate.cfg.Configuration.parseSessionFactory(Configuration.java:2227)
at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:2207)
at org.hibernate.cfg.AnnotationConfiguration.doConfigure(AnnotationConfiguration.java:213)
at org.hibernate.cfg.AnnotationConfiguration.doConfigure(AnnotationConfiguration.java:46)
at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:2160)
at org.hibernate.cfg.AnnotationConfiguration.doConfigure(AnnotationConfiguration.java:201)
at org.hibernate.cfg.AnnotationConfiguration.doConfigure(AnnotationConfiguration.java:46)
at org.hibernate.cfg.Configuration.configure(Configuration.java:2075)
at org.hibernate.cfg.AnnotationConfiguration.configure(AnnotationConfiguration.java:183)
at org.hibernate.cfg.AnnotationConfiguration.configure(AnnotationConfiguration.java:46)
at org.hibernate.cfg.Configuration.configure(Configuration.java:2054)
at org.hibernate.cfg.AnnotationConfiguration.configure(AnnotationConfiguration.java:177)
at com.hibernate.Main.main(Main.java:16)
Так что неправильно с тем, что я написал, я думаю, что все правильно.
Это моя структура папок проекта:
Это класс Student_Info
:
@Entity
@Table(name="STUDENT_INFORMATION")
public class Student_Info {
@Id
private int rollNo;
private String name;
public int getRollNo() {
return rollNo;
}
public void setRollNo(int rollNo) {
this.rollNo = rollNo;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Я создал файл с именем Student_Info.hbm.xml
в пакете com.hibernate
:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.hibernate.Student_Info" table="STUDENT_INFORMATION" catalog="hibernatedb">
<id name="rollNo" type="int">
<column name="rollNo" />
<generator class="assigned" />
</id>
<property name="name" type="string">
<column name="name" />
</property>
</class>
</hibernate-mapping>
И в hibernate.cfg.xml
я изменил эту строку:
<mapping resource="com.hibernate.Student_Info" />
С:
<mapping resource="com.hibernate.Student_Info.hbm.xml" />
Но когда я запускаю класс Main, я получаю эту ошибку:
Exception in thread "main" org.hibernate.MappingNotFoundException: resource: com.hibernate.Student_Info.hbm.xml not found
at org.hibernate.cfg.Configuration.addResource(Configuration.java:767)
at org.hibernate.cfg.AnnotationConfiguration.addResource(AnnotationConfiguration.java:123)
at org.hibernate.cfg.AnnotationConfiguration.addResource(AnnotationConfiguration.java:46)
at org.hibernate.cfg.Configuration.parseMappingElement(Configuration.java:2255)
at org.hibernate.cfg.Configuration.parseSessionFactory(Configuration.java:2227)
at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:2207)
at org.hibernate.cfg.AnnotationConfiguration.doConfigure(AnnotationConfiguration.java:213)
at org.hibernate.cfg.AnnotationConfiguration.doConfigure(AnnotationConfiguration.java:46)
at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:2160)
at org.hibernate.cfg.AnnotationConfiguration.doConfigure(AnnotationConfiguration.java:201)
at org.hibernate.cfg.AnnotationConfiguration.doConfigure(AnnotationConfiguration.java:46)
at org.hibernate.cfg.Configuration.configure(Configuration.java:2075)
at org.hibernate.cfg.AnnotationConfiguration.configure(AnnotationConfiguration.java:183)
at org.hibernate.cfg.AnnotationConfiguration.configure(AnnotationConfiguration.java:46)
at org.hibernate.cfg.Configuration.configure(Configuration.java:2054)
at org.hibernate.cfg.AnnotationConfiguration.configure(AnnotationConfiguration.java:177)
at com.hibernate.Main.main(Main.java:16)
После добавления файла Student_Info.hbm.xml
мне пришлось переместить его в папку src
, и это сработало, но мне пришлось изменить эту строку:
<mapping resource="com.hibernate.Student_Info.hbm.xml" />
к:
<mapping resource="Student_Info.hbm.xml" />
Проблема заключается в отображении тега вашего файла hibernate.cfg.xml.
Решение Для сопоставлений на основе аннотаций
Если вы используете аннотацию, то в файле hibernate.cfg.xml в теге сопоставления используйте атрибут класса вместо ресурса. Должен быть
<mapping class="com.hibernate.Student_Info"/>
Решение Для сопоставлений на основе XML
Если вы хотите использовать отдельный файл hbm для сопоставления, то в файле hibernate.cfg.xml вы должны использовать атрибут ресурса в файле сопоставления. Но в этом случае вам нужно указать местоположение файла hbm так же, как показано ниже (используйте/вместо.)
<mapping resource="com/hibernate/Student_Info.hbm.xml"/>
Надеюсь, это решит вашу проблему.
Я думаю, что это не правильно>
<mapping resource="com.hibernate.Student_Info" />
Это говорит о спящем режиме, где находятся файлы hbm, а не сущности, а затем в файлах hbm.xml вы можете добавлять объекты.
<class name="Student_Info" table="Student_Info ">
...
</class>
В самом деле
com.hibernate.Student_Info not found
Значит, нет файла com.hibernate.Student_Info, подумайте об этом.
ОБНОВИТЬ
Чтобы исправить следующее исключение, вы должны рассмотреть возможность переименования файла в java.
Exception in thread "main" org.hibernate.MappingNotFoundException: resource: com.hibernate.Student_Info.hbm.xml not found
Это означает, что вы должны использовать
<mapping resource="Student_Info.hbm.xml" />
И имя файла должно быть именем * Student_Info.hbm.xml * должно быть на уровне hibernate.cfg.xml
Попробуй это
@Entity
@Table(name="STUDENT_INFORMATION")
public class Student_Info {
@Id
@column(name="your id column name")
private int rollNo;
@column(name="your name column name")
private String name;
public int getRollNo() {
return rollNo;
}
public void setRollNo(int rollNo) {
this.rollNo = rollNo;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Вы не указали какое-либо сопоставление в своей таблице, и если вам не предоставлено какое-либо сопоставление, то механизм ORM проверяет одинаковые имена столбцов в базе данных как параметр по умолчанию, и все же, если не нашел ничего, он будет генерировать исключение отображения. Включите свой журнал и найдите дополнительную информацию о том, как работает Hibernate...
Надеюсь, это полезно!
hibernate.cfg.xml
я использовал этот <property name="hbm2ddl.auto">create</property>
, поэтому он должен создать новую таблицу с именем STUDENT_INFORMATION, если в базе данных нет таблицы со свойствами Student_Info
Класс как столбцы.
Вы не сказали, что спящий режим Student_Info
является сущностью.
Пожалуйста, обратитесь к http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html/entity.html#entity-mapping-entity