[SPRING] 최대 절전 테이블 매핑 오류
SPRING최대 절전 테이블 매핑 오류
데이터베이스를 통해 CRUD 연산을 만들기 위해 Hibernate를 사용하는 웹 애플리케이션이있다. 테이블이 매핑되지 않았다는 오류가 나타납니다. 자바 파일보기 :
에러 메시지:
org.springframework.orm.hibernate3.HibernateQueryException: Books is not mapped [SELECT COUNT(*) FROM Books]; nested exception is org.hibernate.hql.ast.QuerySyntaxException: Books is not mapped [SELECT COUNT(*) FROM Books]
at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:660)
at org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:412)
at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:411)
...
Caused by: org.hibernate.hql.ast.QuerySyntaxException: Books is not mapped [SELECT COUNT(*) FROM Books]
at org.hibernate.hql.ast.util.SessionFactoryHelper.requireClassPersister(SessionFactoryHelper.java:181)
at org.hibernate.hql.ast.tree.FromElementFactory.addFromElement(FromElementFactory.java:111)
at org.hibernate.hql.ast.tree.FromClause.addFromElement(FromClause.java:93)
...
내 DAO.java 메서드는 다음과 같습니다.
public int getTotalBooks(){
return DataAccessUtils.intResult(hibernateTemplate.find("SELECT COUNT(*) FROM Books"));
}
Book.java:
@Entity
@Table(name="Books")
public class Book {
@Id
@GeneratedValue
@Column(name="id")
private int id;
@Column(name="title", nullable=false)
private String title;
...
}
작동하려면 어떻게 수정해야합니까?
해결법
-
==============================
1.예외 메시지는 무엇을 말합니까? 그것은 말한다 :
예외 메시지는 무엇을 말합니까? 그것은 말한다 :
그게 당신에게 무엇을 말합니까? 도서가 매핑되지 않았다는 것을 알려줍니다. 즉, Books라는 매핑 된 유형이 없다는 것입니다.
실제로, 그렇지 않습니다. 매핑 된 유형을 도서라고합니다. Books라는 테이블에 매핑되지만 형식은 Book입니다. HQL (또는 JPQL) 쿼리를 작성할 때 테이블이 아닌 유형의 이름을 사용합니다.
따라서 쿼리를 다음으로 변경하십시오.
나는 그것이 필요하다고 생각하지만
HQL이 * 표기법을 지원하지 않는 경우.
예외 메시지를 읽음으로써 많은 것을 배울 수 있습니다!
-
==============================
2.Hibernate는 "Books"라는 엔티티를 알지 못한다고 말하고있다. 엔티티를 살펴 보겠습니다.
Hibernate는 "Books"라는 엔티티를 알지 못한다고 말하고있다. 엔티티를 살펴 보겠습니다.
@javax.persistence.Entity @javax.persistence.Table(name = "Books") public class Book {
권리. Book의 테이블 이름은 "Books"로 바뀌었지만 엔티티 이름은 여전히 클래스 이름의 "Book"입니다. 엔티티 이름을 설정하려면 @Entity 주석에서 이름을 사용해야합니다.
// this allows you to use the entity Books in HQL queries @javax.persistence.Entity(name = "Books") public class Book {
엔티티 이름과 테이블 이름이 모두 설정됩니다.
Person.hbm.xml 파일에서 Java 어노테이션을 사용하여 최대 절전 모드 필드를 설명 할 때 약간 다른 문제가 발생했습니다. 내 오래된 XML 파일은 다음과 같습니다.
<hibernate-mapping package="..."> <class name="Person" table="persons" lazy="true"> ... </hibernate-mapping>
그리고 새 엔티티에는 @Entity (name = ...)가있어서 테이블의 이름을 설정해야한다고 생각했습니다.
// this renames the entity and sets the table name @javax.persistence.Entity(name = "persons") public class Person { ...
그때 내가보고 있던 HQL 오류는 다음과 같습니다.
QuerySyntaxException: Person is not mapped [SELECT id FROM Person WHERE id in (:ids)]
이 문제는 엔티티 이름도 바뀌 었음을 의미합니다. 테이블 이름을 다음과 같이 설정해야합니다.
// no name = here so the entity can be used as Person @javax.persistence.Entity // table name specified here @javax.persistence.Table(name = "persons") public class Person extends BaseGeneratedId {
희망이 다른 사람들을 돕는다.
-
==============================
3.모든 분에게 감사합니다. 좋은 아이디어 많이. 이것은 Spring과 Hibernate에서의 첫 번째 응용 프로그램입니다 .. 나 같은 "초보자"를 다룰 때는 좀 더 인내하십시오.
모든 분에게 감사합니다. 좋은 아이디어 많이. 이것은 Spring과 Hibernate에서의 첫 번째 응용 프로그램입니다 .. 나 같은 "초보자"를 다룰 때는 좀 더 인내하십시오.
Tom Anderson과 Roman C.의 대답을 읽어주십시오. 그들은 문제를 아주 잘 설명했다. 모두들 나를 도왔습니다.
SELECT COUNT(*) FROM Books
와
select count(book.id) from Book book
그리고 물론, 나는이 Spring 설정을 가지고있다 :
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> <property name="packagesToScan" value="extjs.model"/>
다시 한번 감사드립니다!
-
==============================
4.Spring 구성에서 sessionFactory가이 속성을 넣은 applicationContext.xml을 입력하십시오.
Spring 구성에서 sessionFactory가이 속성을 넣은 applicationContext.xml을 입력하십시오.
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> <property name="packagesToScan" value="${package.name}"/>
-
==============================
5.이 답변은 늦게 제공되지만 "매핑되지 않은 테이블"예외와 관련된 개념이 요약되어 있습니다 (최대 절전 모드 초보자에게이 문제가 발생했을 때 도움을주기 위해). 이 오류는 많은 이유들로 인해 나타날 수 있지만, 목표는 초보자를위한 최대 절전 모드 개발자들이 많은 시간을 절약하기 위해 직면하는 가장 일반적인 문제를 해결하는 것입니다. 나는 아래에 간단한 데모를 위해 나의 예를 사용하고있다.
이 답변은 늦게 제공되지만 "매핑되지 않은 테이블"예외와 관련된 개념이 요약되어 있습니다 (최대 절전 모드 초보자에게이 문제가 발생했을 때 도움을주기 위해). 이 오류는 많은 이유들로 인해 나타날 수 있지만, 목표는 초보자를위한 최대 절전 모드 개발자들이 많은 시간을 절약하기 위해 직면하는 가장 일반적인 문제를 해결하는 것입니다. 나는 아래에 간단한 데모를 위해 나의 예를 사용하고있다.
예외 :
org.hibernate.hql.internal.ast.QuerySyntaxException: subscriber is not mapped [ from subscriber]
간단히 말해서,이 매우 일반적인 예외는 아래의 코드에서 쿼리가 잘못되었다는 것을 나타냅니다.
Session session = this.sessionFactory.getCurrentSession(); List<Subscriber> personsList = session.createQuery(" from subscriber").list();
내 POJO 클래스 선언 방법입니다.
@Entity @Table(name = "subscriber") public class Subscriber
그러나 쿼리 구문 "from subscriber"가 올 바르고 테이블 구독자가 존재합니다. 어느 것이 핵심 포인트로 나를 데려다 준다.
어떻게 설명했는지
위 쿼리가 HQL이기 때문에 구독자는 테이블 이름이 아닌 엔티티 이름으로 간주됩니다. 엔터티 구독자와 매핑 된 테이블 구독자가 있으므로 코드를 다음과 같이 변경하면 문제가 해결됩니다.
Session session = this.sessionFactory.getCurrentSession(); List<Subscriber> personsList = session.createQuery(" from Subscriber").list();
혼란에 빠지기 만하면됩니다. HQL은 많은 경우에 대소 문자를 구분합니다. 그렇지 않으면 그것은 내 경우에 효과가 있었을 것이다.
https://www.tutorialspoint.com/hibernate/hibernate_query_language.htm
Hibernate 매핑이 어떻게 작동하는지 더 이해하려면, 이것을 읽으십시오.
-
==============================
6.Hibernate는 대문자 사용에 대해서도 까다 롭다. 기본적으로 첫 글자가 대문자 인 클래스 이름이됩니다. 따라서 클래스가 FooBar이면 "foobar"를 전달하지 마십시오. 정확한 대문자 사용으로 "FooBar"를 전달해야합니다.
Hibernate는 대문자 사용에 대해서도 까다 롭다. 기본적으로 첫 글자가 대문자 인 클래스 이름이됩니다. 따라서 클래스가 FooBar이면 "foobar"를 전달하지 마십시오. 정확한 대문자 사용으로 "FooBar"를 전달해야합니다.
-
==============================
7.소스 루트 디렉토리 모듈에서 엔티티 클래스에 대한 전체 경로를 추가하십시오.
소스 루트 디렉토리 모듈에서 엔티티 클래스에 대한 전체 경로를 추가하십시오.
from https://stackoverflow.com/questions/14446048/hibernate-table-not-mapped-error by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 봄철 테스트에서 범위가 지정된 콩을 요청하십시오. (0) | 2018.12.14 |
---|---|
[SPRING] MaxUploadSizeExceededException을 처리하는 방법 (0) | 2018.12.14 |
[SPRING] 맞춤 컨트롤러가 Spring-Data-Rest / Spring-Hateoas 클래스의 형식을 미러링하도록 만들 수 있습니까? (0) | 2018.12.14 |
[SPRING] 봄 보안 인증 예외에 대한 JSP로 사용자 정의 오류 메시지를 표시하는 방법 (0) | 2018.12.14 |
[SPRING] 스프링 부팅시 기본 URL을 설정하는 방법은 무엇입니까? (0) | 2018.12.14 |