java - Spring Rest - 具有 @ManyToOne 映射的字段为 null

标签 java spring-data h2 spring-rest

我有以下情况:

  1. 2 个实体,用户和公司;
  2. 我正在使用 H2 数据库;
  3. 我保留了一个公司,一切正常,并且返回了 id 1;
  4. 当我尝试将用户保存到公司时,数据库中的字段 company_id 为空。我不知道发生了什么事!请参阅我的 json 来保留用户:

    { “id”:空, "name": "我的名字", "login": "我的登录", “邮件”:“[email protected]”, "密码":" secret ", "federalID":"0000000", “公司”:{“id”:1} }

我不会发布 Controller 和其他类,只是会展示解决这个问题的重要性。在您的 map 使用的类下方

用户类别:

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

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String name;
    private String login;
    private String mail;
    private String password;
    private String federalID;
    @ManyToOne(optional = false, cascade = CascadeType.ALL)
    @JoinColumn(name = "company_id", referencedColumnName="company_id")
    private Company company;
}

公司类别:

@Entity(name="companies")
@Table(name="companies")
@EqualsAndHashCode
@Data
public class Company {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String name;
    private String federalID;
    @OneToMany(mappedBy="company", targetEntity=User.class, fetch=FetchType.EAGER) 
    private List<User> users;
}

其余用户实体(公司 Controller 遵循相同的模式):

@RestController
public class UsersController {

    @Autowired 
    UserRepository userRepository;

    @RequestMapping(value = "/user", method = RequestMethod.GET)
    public List<User> getUsers(){
        return userRepository.findAll();
    }

    @RequestMapping(value = "/user/{id}", method = RequestMethod.GET)
    public User getUser(@PathVariable("id") Long id){
        return userRepository.findById(id);
    }

    @RequestMapping(value = "/user", method = RequestMethod.POST)
    public ResponseEntity<User> createUser(@RequestBody User company){
        return new ResponseEntity<>(userRepository.save(company), HttpStatus.CREATED);
    }

    @RequestMapping(value = "/user/{id}", method = RequestMethod.DELETE)
    public ResponseEntity<Void> deleteUser(@PathVariable("id") Long id){
        userRepository.delete(id);

        return new ResponseEntity<Void>(HttpStatus.OK);
    }

}

最佳答案

如您所见,Company 是您的 User 类上的关系。因此,Hibernate 无法将其识别为已初始化的实体。 要解决此问题,您应该使用company_id手动加载公司,并将加载的公司设置到UserController内的User类中。

关于java - Spring Rest - 具有 @ManyToOne 映射的字段为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46119395/

相关文章:

hibernate - CRUD 存储库不遵守 UNIQUE 约束

java - 为什么我的 ArrayList 项会转换为 Java 中的对象?

java - 根 url 的匹配和静态资源的服务

java - 在 JavaFX 方法中使用参数

java - 将更新更改生成为增量脚本

java - 未找到 H2 bundle 依赖项

jpa - 将 Spring Data 查询构建器与 Spring Data JPA 规范相结合?

spring - Spring Data JPA中@Modifying方法的返回值是什么意思

Spring 数据: "delete by" is supported?

java - 为什么 H2 不需要 JDBC 驱动程序