尝试使用 JPA 存储库执行数据库保存时,由于实体未被识别为实体而导致的错误

Dan*_*nii 0 java spring hibernate jpa spring-boot

我正在/users/register用身体打电话

{
    "username": "daniel",
    "email": "email@yahoo.com",
    "password": "something"
}
Run Code Online (Sandbox Code Playgroud)

用户

package com.youngahn.RobinhoodAPI.entity;

import jakarta.persistence.*;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;

import java.math.BigDecimal;
import java.util.HashSet;
import java.util.Set;

@Entity
@Table(name = "users")
@Data
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @NotBlank
    private String username;

    @NotBlank
    private String email;

    @NotBlank
    private String password;

    private BigDecimal funds = new BigDecimal("0.00");

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "user")
    public Set<UserStock> userStocks = new HashSet<>();

}

Run Code Online (Sandbox Code Playgroud)

用户控制器

package com.youngahn.RobinhoodAPI.controllers;

import com.youngahn.RobinhoodAPI.dtos.LoginRequestDto;
import com.youngahn.RobinhoodAPI.dtos.RegisterRequestDto;
import com.youngahn.RobinhoodAPI.entity.User;
import com.youngahn.RobinhoodAPI.repository.UserRepository;
import com.youngahn.RobinhoodAPI.service.UserService;
import jakarta.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/users")
@CrossOrigin(origins = "*")
public class UserController {
    private UserRepository userRepository;

    @Autowired
    public UserController(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    @PostMapping("/signin")
    public ResponseEntity<?> getUser(@RequestBody LoginRequestDto loginRequestDto) {
        return ResponseEntity.ok(loginRequestDto);
    }

    @PostMapping("/register")
    public ResponseEntity<?> createUser(@Valid @RequestBody RegisterRequestDto registerRequestDto) {
        User user = new User() {{
            setUsername(registerRequestDto.getUsername());
            setEmail(registerRequestDto.getEmail());
            setPassword(registerRequestDto.getPassword());
        }};

        userRepository.save(user);
        return ResponseEntity.ok(registerRequestDto);
    }
}

Run Code Online (Sandbox Code Playgroud)

用户存储库

package com.youngahn.RobinhoodAPI.repository;

import com.youngahn.RobinhoodAPI.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface UserRepository extends JpaRepository<User, Long> {
    
}
Run Code Online (Sandbox Code Playgroud)

我收到此错误,实体在尝试保存时似乎未被识别为实体。我在谷歌上没有看到任何类似的错误。

{
    "timestamp": "2023-03-08T05:40:40.215+00:00",
    "status": 500,
    "error": "Internal Server Error",
    "trace": "org.springframework.dao.InvalidDataAccessApiUsageException: com.youngahn.RobinhoodAPI.controllers.UserController$1 is not an entity\n\tat

...

    "message": "com.youngahn.RobinhoodAPI.controllers.UserController$1 is not an entity",
    "path": "/users/register"
}
Run Code Online (Sandbox Code Playgroud)

J A*_*rov 5

new User()当您在实际创建没有注释的 User 匿名子类之后立即调用 {} 时@Entity(子类无法访问类级别注释)

只需这样做:

User user = new User();
user.setUsername(registerRequestDto.getUsername());
user.setEmail(registerRequestDto.getEmail());
user.setPassword(registerRequestDto.getPassword());
Run Code Online (Sandbox Code Playgroud)

如果您确实想节省时间和线条,只需创建一个合适的构造函数或使用构建器模式。(但请确保也定义一个无参数构造函数 - spring jpa 需要它)