【问题标题】:Spring boot multiple module project org.hibernate.hql.internal.ast.QuerySyntaxException: is not mappedSpring Boot 多模块项目 org.hibernate.hql.internal.ast.QuerySyntaxException: is not mapped
【发布时间】:2020-08-26 03:43:22
【问题描述】:

我创建了一个带有父 pom 和 3 个子模块的多模块 spring boot 项目。

模块 test-data 和 test-service 没有主类。我用它作为罐子。 在模块测试数据中,我添加了一些实体类用户和登录:

@Table
@Entity
public class Login implements Serializable {
    ... another column
    @Column(unique = true, columnDefinition = "VARCHAR(50)", nullable = false)
    private String username;
    @JsonIgnore
    @OneToOne(mappedBy = "login")
    private User user;
    // getter and setter

用户类:

@Table
@Entity
public class User implements Serializable{
...
    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(referencedColumnName = "login_id")
    private Login login;
...

模块test-data的pom.xml:

 <parent>
        <groupId>com.emo.test</groupId>
        <artifactId>emo-parent</artifactId>
        <version>1.0-SNAPSHOT</version>
        <relativePath/>
    </parent>

    <artifactId>test-data</artifactId>
    <version>${parent.version}</version>
    <packaging>jar</packaging>
    <description>Demo project for Spring Boot</description>

    <dependencies>
        <dependency>
            <groupId>org.liquibase</groupId>
            <artifactId>liquibase-core</artifactId>
        </dependency>
        <dependency>
            <groupId>org.liquibase</groupId>
            <artifactId>liquibase-maven-plugin</artifactId>
            <version>3.8.2</version>
        </dependency>
    </dependencies>

在模块 test-service 中,我添加了一些服务类:

package com.test.api.serviceImpl;

import com.test.core.entities.Login;
import com.test.core.entities.User;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

@Transactional
@Service("userServiceImpl")
public class UserServiceImpl {

    @PersistenceContext
    private EntityManager entityManager;

    public User findByUsername(String username) throws EmptyResultDataAccessException {
        String query = "FROM Login l WHERE l.username = :username";
        final Login l = (Login) entityManager.createQuery(query).setParameter("username", username).getSingleResult();
        return l.getUser();
    }
}

测试服务的 pom:

<parent>
        <groupId>com.emo.test</groupId>
        <artifactId>test</artifactId>
        <version>0.1-SNAPSHOT</version>
    </parent>

    <artifactId>test-service</artifactId>
    <version>${parent.version}</version>
    <packaging>jar</packaging>

    <name>test-service</name>
    <url>http://maven.apache.org</url>

    <dependencies>
        <dependency>
            <groupId>com.test.kazi</groupId>
            <artifactId>test-data</artifactId>
            <version>${project.version}</version>
        </dependency>
    </dependencies>
</project>

在我的 test-oauth 中,我有一个主类,我想运行这个模块:

test-oauth的主类:

package com.oauth.server;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class OAuthApplication {

    public static void main(String[] args) {
        SpringApplication.run(OAuthApplication.class, args);
    }

我在模块 test-oauth 中添加了模块 test-service 作为依赖项,如下所示:

<modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>com.emo.test</groupId>
        <artifactId>emo-parent</artifactId>
        <version>1.0-SNAPSHOT</version>
        <relativePath/>
    </parent>

    <artifactId>test-oauth</artifactId>
    <version>${parent.version}</version>
    <packaging>jar</packaging>

    <name>test-oauth</name>
    <url>http://maven.apache.org</url>

    <dependencies>
        <dependency>
            <groupId>com.emo.test</groupId>
            <artifactId>test-service</artifactId>
            <version>${project.version}</version>
        </dependency>
    </dependencies>
<build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <skip>true</skip>
                </configuration>
            </plugin>
        </plugins>
    </build>

进入模块test-oauth,我使用实体UserServiceImpl:

package com.oauth.server.security;

import com.test.api.serviceImpl.UserServiceImpl;
import com.test.core.entities.Login;
import com.test.core.entities.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;

import java.util.Collection;

@Service("customUserDetailsService")
public class CustomUserDetailsService implements UserDetailsService {

    private UserServiceImpl userServiceImpl;

    @Autowired
    public CustomUserDetailsService(UserServiceImpl userServiceImpl) {
        this.userServiceImpl = userServiceImpl;
    }

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        final User user = userServiceImpl.findByUsername(username);
        if (user == null)
            throw new UsernameNotFoundException(String.format("User %s does not exist!", username));
        return new UserRepositoryUserDetails(user);
    }

我遇到了这个异常:

{"error":"unauthorized","error_description":"org.hibernate.hql.internal.ast.QuerySyntaxException: Login is not mapped [FROM Login l WHERE l.username = :username]"}* Closing connection 0

我的父母 pom.xml

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.9.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <groupId>com.emo.test</groupId>
    <artifactId>test</artifactId>
    <version>0.1-SNAPSHOT</version>
    <packaging>pom</packaging>

    <modules>
        <module>test-data</module>
        <module>test-service</module>
        <module>test-oauth</module>
    </modules>

    <properties>
        <java.version>1.11</java.version>
        <oauth.version>2.2.2.RELEASE</oauth.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.security.oauth</groupId>
            <artifactId>spring-security-oauth2</artifactId>
            <version>${oauth.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.7.0</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <verbose>true</verbose>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <repositories>
        <repository>
            <id>spring-releases</id>
            <url>https://repo.spring.io/libs-release</url>
        </repository>
    </repositories>

    <pluginRepositories>
        <pluginRepository>
            <id>spring-plugin-releases</id>
            <url>https://repo.spring.io/plugins-release</url>
        </pluginRepository>
    </pluginRepositories>

【问题讨论】:

    标签: java spring hibernate spring-boot maven


    【解决方案1】:

    问题是您的实体类未被识别为 JPA 实体。当实体在主入口点的同一包或子包中声明时,Springboot 会自动执行此操作。由于您的入口点属于包com.oauth.server 并且您的实体在包com.test.core.entities 中,因此您必须使用@EntityScan“手动”配置它。

    在您的主入口点完成的示例:

    @SpringBootApplication
    @EntityScan(basePackages = "com.test.core.entities")
    public class OAuthApplication {
        /* ... */
    }
    

    【讨论】:

    • 现在我有这个错误:org.hibernate.exception.SQLGrammarException: could not extract ResultSet
    • @emoleumassi 请提供更多异常信息。
    • 我将@EntityScan 添加到OAuthApplication 与我现在得到的相同代码错误org.hibernate.exception.SQLGrammarException: could not extract ResultSet
    • 这通常发生在您需要调整实体之间的关系时。请看stackoverflow.com/q/20089031/1065197
    • 两个表之间存在OneToOne 关系。 username 有一个独特的约束。在我的数据库中,我只有一个带有 username 的元素
    猜你喜欢
    • 1970-01-01
    • 2019-02-10
    • 1970-01-01
    • 2018-10-07
    • 2015-10-10
    • 1970-01-01
    • 2014-06-02
    • 2016-03-27
    • 1970-01-01
    相关资源
    最近更新 更多