2012-04-04 47 views
12

Tôi đang thử nghiệm thiết bị DAO của mình bằng cách sử dụng lò xo. Tôi đang sử dụng JPA + Hibernate.Chức năng không được hỗ trợ từ hibernate

Đối với các bài kiểm tra của tôi đang sử dụng phiên bản HSQLDB sau:

<dependency> 
    <groupId>hsqldb</groupId> 
    <artifactId>hsqldb</artifactId> 
    <version>1.8.0.10</version> 
    <scope>test</scope> 
</dependency> 

Và đây là persistence.xml tôi cho kiểm tra đơn vị của tôi:

<persistence-unit name="unit-test-pu" transaction-type="RESOURCE_LOCAL"> 
     <properties> 
     <property name="javax.persistence.jdbc.driver" value="org.hsqldb.jdbcDriver"/> 
     <property name="javax.persistence.jdbc.user" value="sa"/> 
     <property name="javax.persistence.jdbc.password" value=""/> 
     <property name="javax.persistence.jdbc.url" value="jdbc:hsqldb:mem:testdb"/> 
     <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/> 
     <property name="hibernate.archive.autodetection" value="class"/> 
     <property name="hibernate.show_sql" value="true"/> 
     <property name="hibernate.use_sql_comments" value="true"/> 
     <property name="hibernate.format_sql" value="true"/> 
     <property name="hibernate.hbm2ddl.auto" value="create"/> 
     </properties>  
    </persistence-unit> 

Đây là lớp học thử nghiệm của tôi:

@ContextConfiguration("/spring/test-context.xml") 
@TestExecutionListeners({TransactionalTestExecutionListener.class}) 
@Transactional 
public class BaseDaoTestCase extends AbstractJUnit4SpringContextTests { 

    @Autowired 
    private MockEntityDao dao; 

    @Test 
    public void testSave_success() { 
     MockEntity e = new MockEntity(); 
     dao.save(e); 
     assertNotNull(e.getId()); 
    } 
} 

Lưu ý: ý tưởng là để kiểm tra DAO của tôi đối với một thể hiện trong bộ nhớ HSQLDB. Mỗi phương pháp thử nghiệm chạy trong một giao dịch được quản lý bởi mùa xuân.

Thật không may, khi tôi chạy này tôi nhận được ngoại lệ sau đây từ ngủ đông:

Caused by: org.hibernate.exception.GenericJDBCException: This function is not supported 
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:54) 
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125) 
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:110) 
    at org.hibernate.engine.jdbc.internal.proxy.ConnectionProxyHandler.continueInvocation(ConnectionProxyHandler.java:146) 
    at org.hibernate.engine.jdbc.internal.proxy.AbstractProxyHandler.invoke(AbstractProxyHandler.java:81) 
    at $Proxy23.prepareStatement(Unknown Source) 
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$2.doPrepare(StatementPreparerImpl.java:105) 
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:166) 
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl.prepareStatement(StatementPreparerImpl.java:103) 
    at org.hibernate.id.insert.AbstractSelectingDelegate.performInsert(AbstractSelectingDelegate.java:55) 
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2764) 
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3275) 
    at org.hibernate.action.internal.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:81) 
    at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:362) 
    at org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction(ActionQueue.java:203) 
    at org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:183) 
    at org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:167) 
    at org.hibernate.event.internal.AbstractSaveEventListener.addInsertAction(AbstractSaveEventListener.java:320) 
    at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:287) 
    at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:193) 
    at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:126) 
    at org.hibernate.ejb.event.EJB3PersistEventListener.saveWithGeneratedId(EJB3PersistEventListener.java:78) 
    at org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:208) 
    at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:151) 
    at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:78) 
    at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:757) 
    at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:732) 
    at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:736) 
    at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:854) 
    ... 42 more 
Caused by: java.sql.SQLException: This function is not supported 
    at org.hsqldb.jdbc.Util.sqlException(Unknown Source) 
    at org.hsqldb.jdbc.Util.notSupported(Unknown Source) 
    at org.hsqldb.jdbc.jdbcConnection.prepareStatement(Unknown Source) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:616) 
    at org.hibernate.engine.jdbc.internal.proxy.ConnectionProxyHandler.continueInvocation(ConnectionProxyHandler.java:138) 
    ... 67 more 

Việc thực hiện phương pháp DAO tôi tiết kiệm() như sau:

entityManager.persist(entity); 

Tôi đang sử dụng theo phiên bản hibernate:

<dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-entitymanager</artifactId> 
    <version>4.1.0.Final</version> 
    <scope>compile</scope> 
</dependency> 

Có ai có đầu mối về những gì đang xảy ra không?

Trả lời

27

Tôi đã gặp sự cố tương tự. Sau khi tôi cập nhật các phụ thuộc của mình (đặc biệt là hsqldb) thành:

<hibernate-core-version>4.1.5.Final</hibernate-core-version> 
    <spring.version>3.1.2.RELEASE</spring.version> 
    <hsqldb.version>2.2.8</hsqldb.version> 
    ... 
    <dependency> 
     <groupId>org.hsqldb</groupId> 
     <artifactId>hsqldb</artifactId> 
     <version>${hsqldb.version}</version> 
    </dependency> 

vấn đề của tôi được giải quyết.

+0

@AntonBessovon thx! đây là vấn đề của tôi cũng là – Eugene

+0

Tôi đã có một MC cổ xưa của HSQL trong pom của tôi. Phiên bản mới nhất hoạt động tốt –

+0

hoạt động này. Cảm ơn ...: D –

0

Bạn đang sử dụng khung mocking nào? Tôi chỉ học cách làm việc với mocks vì vậy đây chỉ là một dự đoán hoang dã nhưng chắc chắn rằng bạn đã thực hiện mọi thứ cần thiết để khởi tạo mô hình. Có lẽ vấn đề có liên quan đến cách thử nghiệm đang được thiết lập.

-1

Tôi đang gặp vấn đề tương tự khi làm việc với JPA + Hibernate + HSQLDB, nhưng không phải là mùa xuân. Đây là mã của tôi:

EntityManagerFactory emf = Persistence.createEntityManagerFactory("persistenceUnit"); 
EntityManager em = emf.createEntityManager(); 
EntityTransaction tr = em.getTransaction(); 
tr.begin(); 
em.persist(new MyEntity()); 
tr.commit(); 
em.close(); 
emf.close(); 

Đó ném tôi cùng This function is not supported ngoại lệ, nhưng nếu tôi làm điều đó mà không có giao dịch, nó không. Như thế này:

EntityManagerFactory emf = Persistence.createEntityManagerFactory("persistenceUnit"); 
EntityManager em = emf.createEntityManager(); 
em.persist(new MyEntity()); 
em.close(); 
emf.close(); 

Vấn đề bây giờ, là tôi không thấy thay đổi được phản ánh trên cơ sở dữ liệu.

+1

Cảm ơn phản hồi nhưng tôi đã cố gắng giải quyết vấn đề này bằng cách sử dụng phiên bản hsqldb mới nhất. Từ những gì tôi có thể hiểu được vấn đề là phiên bản của hsqldb mà tôi sử dụng đã không thực hiện một số tính năng được sử dụng bởi hibernate. –

+0

btw rất có thể bạn không thấy các thay đổi của mình trên cơ sở dữ liệu vì bạn chưa định cấu hình giao dịch trên các phương thức dịch vụ của mình. Hibernate sẽ xóa các thay đổi của bạn sau khi giao dịch được thực hiện. Trừ khi bạn cấu hình các phương thức dịch vụ của bạn để được ngủ đông giao dịch sẽ không gửi chúng đến cơ sở dữ liệu của bạn. –

Các vấn đề liên quan