【发布时间】:2022-01-21 15:12:50
【问题描述】:
我正在使用 JPA2 和 Springboot2X。试图在User 和Account 表中定义简单的一对一关系。
User 是父级,Account 是子级。这种关系是从父母到孩子的。已关注this。
User 表有一个列account_no 来保存帐号,它是Account 表的主键。所以User 持有外键。
@Entity
public class Account extends AbstractEntity implements Serializable{
// fields like account#, balance etc goes here..
@OneToOne (fetch = FetchType.LAZY)
private User user;
}
@Entity
public class User extends AbstractEntity implements Serializable{
// Other fields related to user entity go here ..
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "account_no", referencedColumnName = "account_number")
private Account account;
}
保存工作正常。但是当我获取用户(User user = userRp.findByUserID(userid);)时,我会从两个表中获取数据。我的问题是当我定义fetch = FetchType.LAZY 时,为什么要获取帐户表数据?我只希望用户数据出现在输出中,就像我在 User 表中运行选择查询时一样。
输出:
{
"id": 1,
"userID": "xxxxx",
"firstName": "Dsd",
"llastName": "cccc",
"email": "danqsaa@brown",
"creation_date": "2021-12-19 19:41",
"modified_date": "2021-12-19 19:41",
"account": {
"id": 2,
"accountNo": 6848982326,
"balance": 4000.0,
"creationUser": "xxx",
"creation_date": "2021-12-19 19:41",
"modified_date": "2021-12-19 19:41",
"transactions": []
}
}
在 RestController、Service 和 Repo 详细信息下方添加。
@RestController
public class UserController {
@GetMapping("/users/{userID}")
public ResponseEntity<Object> getUser(@PathVariable("userID") String userID){
return new ResponseEntity<>(userServiceImpl.getUserByID(userID), HttpStatus.OK));
}
}
@Service
public class UserService {
// injected user repo
public User getUserByID(String userID){
return userRepo.findByUserID(userID);
}
}
public interface UsersRepository extends CrudRepository<User, String> {
User findByUserID(String userID);
}
【问题讨论】:
-
您的
Output那里-您如何将数据序列化到该对象中?还是只是从您的 select 语句中返回的 json。 -
@cjnash 这是我的休息控制器的输出。来自邮递员。
-
这里只是一个想法,也许当对象被序列化时,getter() 被调用,从而触发了加载。您可以通过调试和检查查询返回的内容与您通过休息返回的内容来检查这一点。不过我可能是错的。
-
不明白你的问题——你期待什么? Jackson 将访问该属性,这会导致关联加载。你期待别的吗?究竟是什么?另外,你的
@Transactional在哪里?
标签: java spring-boot spring-data-jpa jpa-2.0 one-to-one