2017-10-27 7 views
1

PostgreSQL DB를 사용하고 있으며 JPA EntityManager를 사용하여 VACUUM FULL을 시작하고 싶습니다.JPA에서 VACUUM FULL 수행

버전 1

public void doVacuum(){ 
    entityManager.createNativeQuery("VACUUM FULL").executeUpdate() 
} 

는 TransactionRequiredException

버전 2

@Transactional 
public void doVacuum(){ 
    entityManager.createNativeQuery("VACUUM FULL").executeUpdate() 
} 

"VACUUM는 트랜잭션 블록 내에서 실행할 수 없습니다"PersistenceException을 던져 던졌습니다

버전 3

public void doVacuum(){ 
    entityManager.createNativeQuery("VACUUM FULL").getResultList() 
} 

진공 수행하지만 그 후 나는 PersistenceException은 "검색 결과"를 얻을

이 SQL 명령을 시작하는 올바른 방법은 무엇입니까?

public void doVacuum(){ 
    org.hibernate.Session session = entityManager.unwrap(org.hibernate.Session); 
    org.hibernate.internal.SessionImpl sessionImpl = (SessionImpl) session; // required because Session doesn't provide connection() 
    java.sql.Connection connection = sessionImpl.connection(); 
    connection.prepareStatement("VACUUM FULL").execute() 
} 
+0

는 JPA 범위에서 수행해야이 정말 뭔가를인가 : 알라이 헤이로 – pirho

+1

기본 연결을 가져 와서 원시 JDBC로 폴백 하시겠습니까? 연결을위한 메커니즘은 다음을 참조하십시오. https://stackoverflow.com/questions/3493495/getting-database-connection-in-pure-jpa-setup –

답변

0

는 기본 연결이 작동하여, 언급? 나는 그것이 나쁜 것임을 의미하지는 않지만 어떤 DBA가 아닌가? JPA를 사용하여 DBA 도구를 개발하려고합니까? 그러나 여전히 흥미로운 측면.
+0

및 엔티티 관리자를 얻는 방법은 무엇입니까? – pixel

+0

이것은 데이터베이스 연결 또는 사용중인 프레임 워크를 처리하는 방법에 따라 다릅니다. 나는 Spring을 사용하고 있으므로 annotated 필드 "@PersistenceContext private EntityManager enitityManger"를 주입하면 충분합니다. – Marcel