【问题标题】:i'm getting null value in a child table as a foreign key of parent table using spring data rest or spring data jpa accosiation我使用spring data rest或spring data jpa accosiation在子表中获取空值作为父表的外键
【发布时间】:2019-02-15 21:59:13
【问题描述】:

enter image description here 在这张图片中,empId 1 的第一个地址和最后两条记录是 empid 2(empid 2 必须寻址) file:///home/user/Pictures/fk.png

@Entity

@Table(name = "Employee")

public class Employee {

@Id
@GeneratedValue
private Integer id;
private String name;
private Integer sal;

@OneToMany(cascade = CascadeType.ALL,mappedBy="employee")
private List<Address> addresses;

//getter 设置器

子实体

@Entity(name="Address")

public class Address {

@Id
@GeneratedValue
private Integer aid;
private String city;
private String state;

@ManyToOne
@JoinColumn(name="id")
private Employee employee;

//getter setter

存储库

@Repository

@RepositoryRestResource(path="employee")

public interface EmployeeRepo extends JpaRepository<Employee,Integer> {


}

来自 RestClient 的输入

{
  "name":"rdhe",

  "sal":"20000",

  "addresses":[{ 

  "city":"hyd",

  "state":"ts"

  }]
}

如果我使用 spring data jpa 那么代码将是 // jpa 存储库

public interface EmployeeRepo extends JpaRepository<Employee,Integer> {


}

// EmployeeServer 类

@Service
public class EmployeeService {

@Autowired
EmployeeRepo employeeRepo;
public void saveEmployee(Employee employee){
    employeeRepo.save(employee);
}

}

// 控制器

@RestController
public class EmployeeController {

@Autowired
EmployeeService employeeService;

@PostMapping(path="/save")
public void saveEmp(@RequestBody Employee employee){
    employeeService.saveEmployee(employee);
}

}

如果我那时使用 spring-data-rest 就不需要创建employeeService 和控制器类

【问题讨论】:

  • 能否分享保存数据的代码
  • 是的,让我知道你的邮件
  • 这里不能分享一下吗?
  • 我说的是发送完整的项目
  • 在我发布所有代码后检查

标签: spring-boot spring-data-jpa spring-data spring-data-rest


【解决方案1】:

在 JsonManagedReference 出现之前,我遇到了同样的问题。

尝试更改您的实体以包含它们,如下所示:

在员工实体中:

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy ="employee")
@JsonManagedReference
private List<Address> addresses;

在地址实体中:

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "id", nullable = false, updatable = false, insertable =true)
@JsonBackReference
private Employee employee;

我无法找到它为什么会这样工作,所以如果你知道的话请告诉我:)

【讨论】:

  • 我已经为此奋斗了好几天了。我已经尝试了我能找到的每一个 SO 答案的每一种组合。唯一有效的是这个答案。我也不明白为什么。它没有看到与数据库相关的信息,但它确实有效。
【解决方案2】:

这可能是因为你提到了@JoinColumn(name="id")@JoinColumn 中的name 属性定义了子表中外键字段的名称。由于您在休眠时将外键列指定为 id,因此可能是问题所在。请将其更新为与数据库中指定的名称相同的名称(即 fk_empid),它应该可以工作...

【讨论】:

  • 不,先生,我已经检查了所有同名的东西,它没有存储
  • 你能分享一下控制台生成的SQL查询吗
  • Hibernate: 调用 hibernate_sequence 的下一个值 Hibernate: 调用 hibernate_sequence 的下一个值 Hibernate: 插入员工 (name, sal, id) 值 (?, ?, ?) Hibernate: 插入地址 (city, id, state, aid) 值 (?, ?, ?, ?)
  • 看到这里是插入地址(城市,身份证,州,援助)值(?,?,?,?)的问题。您的地址表中没有 id 字段根据屏幕截图..那么为什么您没有收到任何异常..您连接到正确的数据库了吗?
  • 以前我当时使用外国 id 作为 fk_empid 我已经拍摄了这个 screatshot 但之后你告诉我曾经检查过同名(id)这就是为什么现在 fk_empid 是 id 仅在表中
猜你喜欢
  • 2022-11-15
  • 1970-01-01
  • 2019-09-30
  • 2020-05-16
  • 2015-07-14
  • 2016-12-10
  • 2013-03-07
  • 2021-02-06
  • 2019-11-18
相关资源
最近更新 更多