2017-04-06 11 views
0

최대 절전 모드에서 CRUD 작업을 구현하려고합니다. 그러나 "테이블에 매핑되지 않았습니다."오류가 발생합니다. 또한 Query는 내 코드에서 더 이상 사용되지 않습니다. 내가 아는 한, 테이블의 매핑은 이런 식으로 수행됩니다. 그럼, 여기서 어떤 문제가 있습니까?최대 절전 모드에서 CRUD 테이블 매핑되지 않은 예외

코드

public void deleteTeacher(String name) { 
    Transaction tx = null; 
    Session session = Utility.getSessionFactory().openSession(); 
    tx = session.beginTransaction(); 
    Query query = session.createQuery("from vi where name=" + name); 
    //Teacher teacher=(Teacher)session.get(Teacher.class, name); 
    Teacher teacher = (Teacher) query.getSingleResult(); 
    session.delete(teacher); 
    session.getTransaction().commit(); 
    session.close(); 
} 

오류

Exception in thread "main" java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: vi is not mapped [from vi where name=Aayushi] 
    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:131) 
    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:155) 
    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:162) 
    at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:658) 
    at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:102) 
    at DAO.deleteTeacher(DAO.java:45) 
    at MainClass.main(MainClass.java:37) 
Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: vi is not mapped [from vi where name=Aayushi] 
    at org.hibernate.hql.internal.ast.QuerySyntaxException.generateQueryException(QuerySyntaxException.java:79) 
    at org.hibernate.QueryException.wrapWithQueryString(QueryException.java:103) 
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:217) 
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:141) 
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:115) 
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:77) 
    at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:153) 
    at org.hibernate.internal.AbstractSharedSessionContract.getQueryPlan(AbstractSharedSessionContract.java:541) 
    at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:650) 
    ... 3 more 
Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: vi is not mapped 
    at org.hibernate.hql.internal.ast.util.SessionFactoryHelper.requireClassPersister(SessionFactoryHelper.java:171) 
    at org.hibernate.hql.internal.ast.tree.FromElementFactory.addFromElement(FromElementFactory.java:91) 
    at org.hibernate.hql.internal.ast.tree.FromClause.addFromElement(FromClause.java:79) 
    at org.hibernate.hql.internal.ast.HqlSqlWalker.createFromElement(HqlSqlWalker.java:324) 
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromElement(HqlSqlBaseWalker.java:3696) 
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromElementList(HqlSqlBaseWalker.java:3585) 
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromClause(HqlSqlBaseWalker.java:720) 
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:576) 
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:313) 
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:261) 
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:266) 
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:189) 
    ... 9 more 

그리고 구성 클래스는

teacher.hbm.xml

HQL에서
<?xml version="1.0" encoding="UTF-8"?> 

<hibernate-mapping> 
    <class name="Teacher" table="vi"> 

     <composite-id> 
      <key-property name="name" column="name" /> 
      <key-property name="subject" column="subject" length="10" /> 
     </composite-id> 


    </class> 
</hibernate-mapping> 

답변

1

'' 사이, 그래서 당신의 쿼리는 다음과 같아야합니다

Query query=session.createQuery("from vi where name='" + name + "'); 

Query query = session.createQuery("from vi where name=:name"); 
query.setParameter("name", name); 

편집

을 단순히 사용하지 않는 이유 : :그러나 구문 오류 또는 SQL 주입을 방지하기 위해, 당신은 사용할 필요가

//no need to select your object before you delete it 
//Query query = session.createQuery("from vi where name=" + name); 
//Teacher teacher=(Teacher)session.get(Teacher.class, name); 
//Teacher teacher = (Teacher) query.getSingleResult(); 

//just make a delete query directly 
String hql = "DELETE FROM vi WHERE name= :name"; 
Query query = session.createQuery(hql); 
query.setParameter("name", name); 
int result = query.executeUpdate(); 

방지하는 방법을 삭제하기 전에 선택하면 결과가 null 인 경우이 오류가 발생할 수 있습니다.

+0

에 대한 링크가 있어도 제약 조건 위반 예외가 발생합니다. 내 github 코드에 대한 링크는 https://github.com/aayushis12/Hibernate입니다. – Aayushi

+0

내 편집 @aayushi 확인 –

0

당신은 쿼리해야 oyur 있도록하지 테이블 이름이 클래스 이름과 함께 일해야 :

또한
"from Teacher where name="+Name 

당신은 SQL 주입을 방지하기 위해, 매개 변수 바인딩을 사용해야 문자열해야

+0

난 당신에게 – Aayushi

+0

는'ConstraintViolationException' 당신이 외부 키를 가지고 있다는 것을 의미 – Jens

+1

@YCF_L을 ConstraintViolationException @Jens을 얻고 난으로 잘못하고있는 무슨 이해하지 않는다 나는 그것을 처음으로 구현하고있다. 제발 도와주세요. 내 github 저장소 https://github.com/aayushis12/Hibernate @Jens – Jens

0

당신의 모델이 주어진다면 당신은 여기에 약간의 가설을 세우고 있습니다. Teacher 모델은 namesubject의 복합 키를 사용하지만 코드는 Teacher이라는 이름을 사용하면 하나의 행 결과를 얻을 수 있다고 가정하며 이는 항상 사실 일 수는 없습니다.

데이터 모델을 조정하고 Teacher 엔티티 전체에서 name 엔티티를 고유하게 설정해야합니다. 실제 상황에서는 다시 이것을 고려하여 제거 코드를 수정하거나 수정할 수 없습니다.

다음 코드는 그래서 몇 가지 작은 개조하면 되겠 필요할 수 있습니다 최대 절전 모드 5.2을 가정하지만, 전제에 관계없이 정확히 동일하게 유지 :

final List<Teacher> teachers = session 
    .createQuery("FROM Teacher t WHERE t.name = :name", Teacher.class) 
    .setParameter("name", teacherName) 
    .getResultList(); 

for (Teacher teacher : teachers) { 
    session.remove(teacher); 
} 

에 대한 @ YCF_L의 지점으로 이전 삭제를 선택, 이것은 실제로 아니다 코드의 결과가 일 수 있다는 사실을 설명하는 경우 문제가 발생하면이 비어 있어야합니다.하지만 복수의 교사 위에있는 실제 시나리오를 따르기 때문에은 같은 이름을 가질 수 있습니다. 반환 된 List<>은 for 루프 삭제를 건너 뛰거나 값을 포함하고 비워 둘 것이기 때문에 오류가 발생하지 않습니다. for-loop를 삭제합니다.

지적한대로 은 오히려 데이터를 가져 오지 않고 맹목적으로 삭제를 실행할 수 있으며 매우 비슷하게 보입니다.

int deleteCount = session 
    .createQuery("DELETE FROM Teacher t WHERE t.name = :name") 
    .setParameter("name", teacherName) 
    .executeUpdate(); 

이 시나리오에서는 제거 된 얼마나 많은 교사 로그인하거나 값이 아마도 당신이 무엇을 기대하지 경우 일부 특정 코드를 실행하는 반환 값 deleteCount을 사용할 수 있습니다.

마지막으로 다른 사람들은 SQL 삽입을 피하기 위해 매개 변수 바인딩을 사용하는 이점을 지적했지만 다른 이유로 인해 매개 변수 바인딩도 중요합니다.

예를 들어, 바인드 매개 변수 SQL은 데이터베이스에 의해 최적화되고 계획되고 캐시 될 수 있으며 이후의 쿼리를 위해 재사용 될 수 있습니다. SQL에 실제 값을 직접 입력하면 대부분의 데이터베이스 플랫폼은 그대로 쿼리를 캐시하므로 동일한 매개 변수로 이전과 똑같은 SQL을 제공하면이 이점을 얻을 수 있습니다. 그때 클래스 이름을하고있는 중이 야 경우