0

I'm very new with Hibernate(JPA).

Here is the related version info: Java 8, Gradle 4.0, Hibernate 5.3.2.Final.

I have a problem that my unit test(JUnit) failed when build it with Gradle.

I have some test codes and surely it passes when run it on Eclipse, but it is failed when run with Gradle(./gradlew build).

I found the following QA on SO and I could pass my test with Gradle using this solution with a warning message.

java - Hibernate with Tomcat and gradle - Stack Overflow

This answer suggests to add the following setting to build.gradle.

sourceSets.all {
    output.resourcesDir = output.classesDir
}

The warning message is the following.

> Configure project :
Gradle now uses separate output directories for each JVM language, but this build assumes a single directory for all classes from a source set. This behaviour has been deprecated and is scheduled to be removed in Gradle 5.0

As you can see, this workaround will be failed when Gradle goes 5.0.

So, I want to ask you how should I build my codes with Hibernate and Gradle.

According to some SO's QA, I tried to add the following dependency, but it does not work.

compile group: 'org.hibernate.javax.persistence', name: 'hibernate-jpa-2.1-api', version: '1.0.2.Final'

Also, I found Hibernate Gradle Plugin, so I added it to the dependency, but it does not work too.

compile group: 'org.hibernate', name: 'hibernate-gradle-plugin', version: '5.3.2.Final'

Maven Repository: org.hibernate » hibernate-gradle-plugin » 5.3.2.Final

Here is a portion of my directory Structure.

.
├── README.md
├── build.gradle
└── src
    └── main
        ├── java
        │   └── com
        │       └── xxxxx
        │           └── xxxxx
        │               └── api
        │                   ├── dao
        │                   │   └── JpaDao.class
        │                   └── dto
        │                       └── Tasks.java
        ├── resources
        │   ├── META-INF
        │   │   └── persistence.xml
        │   └── hibernate.properties
        └── webapp
            ├── index.html
            └── v1-docs
                └── index.html

Portion of my build.gradle file is the following:

apply plugin: 'java'
apply plugin: 'eclipse-wtp'
apply plugin: 'war'
apply plugin: 'checkstyle'

def defaultEncoding = 'UTF-8'
tasks.withType(AbstractCompile).each {
  it.options.encoding = defaultEncoding
}
tasks.withType(GroovyCompile).each {
  it.groovyOptions.encoding = defaultEncoding
}
[compileJava, compileTestJava].each {
  it.options.compilerArgs += ['-source', '1.8', '-target', '1.8']
}

repositories {
  jcenter()
}

dependencies {
  compile group: 'org.hibernate', name: 'hibernate-core', version: '5.3.2.Final'
  testCompile group: 'junit', name: 'junit', version: '4.12'
}

sourceSets.all {
    output.resourcesDir = output.classesDir
}

My Entity, i.e. Tasks class(this class name shows up on my error output), is the following:

@Entity
public class Tasks {

    @Id
    public UUID id;

    @Column(name = "is_finished")
    public boolean isFinished;

    @Column(name = "updated_at")
    public Timestamp updatedAt;

    @Column(name = "user_id")
    public String userId;
}

My JPA calling code is the following:

EntityManager em = entityManagerFactory.createEntityManager();
TypedQuery<Tasks> query = em
        .createQuery("SELECT task FROM Tasks task WHERE task.userId = :userId", Tasks.class)
        .setParameter("userId", userId);
tasksDtoList = query.getResultList();
em.close();

And error output is the following(bit a long, but I'm not sure where is the important clue to resolve):

java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: Tasks is not mapped [SELECT task FROM Tasks task WHERE task.userId = :userId]
    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:133)
    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:157)
    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:164)
    at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:715)
    at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:731)
    at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:23)
    at com.soybs.taskrtomato.api.dao.JpaDao.getTaskList(JpaDao.java:54)
    at com.soybs.taskrtomato.api.service.UserServiceTest.test(UserServiceTest.java:26)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecuter.runTestClass(JUnitTestClassExecuter.java:114)
    at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecuter.execute(JUnitTestClassExecuter.java:57)
    at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassProcessor.processTestClass(JUnitTestClassProcessor.java:66)
    at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:51)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
    at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
    at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:32)
    at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93)
    at com.sun.proxy.$Proxy1.processTestClass(Unknown Source)
    at org.gradle.api.internal.tasks.testing.worker.TestWorker.processTestClass(TestWorker.java:109)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
    at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
    at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:146)
    at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:128)
    at org.gradle.internal.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:404)
    at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
    at org.gradle.internal.concurrent.StoppableExecutorImpl$1.run(StoppableExecutorImpl.java:46)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
    at java.lang.Thread.run(Thread.java:748)
Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: Tasks is not mapped [SELECT task FROM Tasks task WHERE task.userId = :userId]
    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:219)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:143)
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:119)
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:80)
    at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:153)
    at org.hibernate.internal.AbstractSharedSessionContract.getQueryPlan(AbstractSharedSessionContract.java:597)
    at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:706)
    ... 51 more
Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: Tasks is not mapped
    at org.hibernate.hql.internal.ast.util.SessionFactoryHelper.requireClassPersister(SessionFactoryHelper.java:169)
    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:331)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromElement(HqlSqlBaseWalker.java:3695)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromElementList(HqlSqlBaseWalker.java:3584)
    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:271)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:191)
    ... 57 more
2
  • Do you have Tasks table in your database? Commented Jul 16, 2018 at 11:31
  • Yes, ofcourse. That's why JUnit test on Eclipse is succeeded. Commented Jul 17, 2018 at 8:37

1 Answer 1

1

I could resolve it with the following config on build.gradle.

sourceSets {
  java {
    main {
      output.resourcesDir = java.outputDir
    }
  }
}

See also: SourceSetOutput - Gradle DSL Version 5.5 https://docs.gradle.org/current/dsl/org.gradle.api.tasks.SourceSetOutput.html

Sign up to request clarification or add additional context in comments.

1 Comment

how in the world would we know to add what looks like completely arbitrary code to build.gradle to get hibernate to work. other then reading the docs for 5 hours... thanks tkhm for following up

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.