Java 尝试从实体获取自动生成的id时获取null,该实体是通过使用JPARepository的findByVariable方法获取的
我有这个模型: User.javaJava 尝试从实体获取自动生成的id时获取null,该实体是通过使用JPARepository的findByVariable方法获取的,java,hibernate,spring-mvc,spring-data-jpa,Java,Hibernate,Spring Mvc,Spring Data Jpa,我有这个模型: User.java @Entity @Table(name = "`user`") public class User { private Long id; private String username; private String phone; @Override public int hashCode() { return new Long(id).hashCode(); } @Override
@Entity
@Table(name = "`user`")
public class User {
private Long id;
private String username;
private String phone;
@Override
public int hashCode() {
return new Long(id).hashCode();
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (!(obj instanceof User)) {
return false;
}
return this.id == ((User) obj).getId();
}
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
(...other getters and setters...)
}
(...)
@RequestMapping(value = "/user/updatePhone", method = RequestMethod.GET)
public String updatePhone(Model model) {
model.addAttribute("userForm", userService.findByUsername("testUsername"));
return "user/updatePhone";
}
@RequestMapping(value = "/user/updatePhone", method = RequestMethod.POST)
public String updatePhone(@ModelAttribute("userForm") User userForm, BindingResult bindingResult, Model model) {
userService.updatePhone(userForm);
return "redirect:/user/view";
}
(...)
@Service
@Transactional
public class UserServiceImpl implements UserService {
(...)
@Override
public void updatePhone(User user) {
User entity = userRepository.findById(user.getId());
if (entity != null) {
entity.setPhone(user.getPhone());
}
}
(...)
}
我的控制器中的这段代码:
UserController.java
@Entity
@Table(name = "`user`")
public class User {
private Long id;
private String username;
private String phone;
@Override
public int hashCode() {
return new Long(id).hashCode();
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (!(obj instanceof User)) {
return false;
}
return this.id == ((User) obj).getId();
}
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
(...other getters and setters...)
}
(...)
@RequestMapping(value = "/user/updatePhone", method = RequestMethod.GET)
public String updatePhone(Model model) {
model.addAttribute("userForm", userService.findByUsername("testUsername"));
return "user/updatePhone";
}
@RequestMapping(value = "/user/updatePhone", method = RequestMethod.POST)
public String updatePhone(@ModelAttribute("userForm") User userForm, BindingResult bindingResult, Model model) {
userService.updatePhone(userForm);
return "redirect:/user/view";
}
(...)
@Service
@Transactional
public class UserServiceImpl implements UserService {
(...)
@Override
public void updatePhone(User user) {
User entity = userRepository.findById(user.getId());
if (entity != null) {
entity.setPhone(user.getPhone());
}
}
(...)
}
在我的服务中:
UserServiceImpl.java
@Entity
@Table(name = "`user`")
public class User {
private Long id;
private String username;
private String phone;
@Override
public int hashCode() {
return new Long(id).hashCode();
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (!(obj instanceof User)) {
return false;
}
return this.id == ((User) obj).getId();
}
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
(...other getters and setters...)
}
(...)
@RequestMapping(value = "/user/updatePhone", method = RequestMethod.GET)
public String updatePhone(Model model) {
model.addAttribute("userForm", userService.findByUsername("testUsername"));
return "user/updatePhone";
}
@RequestMapping(value = "/user/updatePhone", method = RequestMethod.POST)
public String updatePhone(@ModelAttribute("userForm") User userForm, BindingResult bindingResult, Model model) {
userService.updatePhone(userForm);
return "redirect:/user/view";
}
(...)
@Service
@Transactional
public class UserServiceImpl implements UserService {
(...)
@Override
public void updatePhone(User user) {
User entity = userRepository.findById(user.getId());
if (entity != null) {
entity.setPhone(user.getPhone());
}
}
(...)
}
我的问题是,当我试图从UserServiceImpl类中的用户对象获取id时,得到的是null。你知道我必须做什么才能在我的用户对象中正确设置id吗?可能是userRepository类的findByUsername(…)方法有问题,该方法返回的对象没有id(这是我的模型中@id和@GeneratedValue(…)注释的前奏)。表单中有id吗?@JalalSordo:我不完全理解你的问题。你是说它使用的语言吗?通常,在我的应用程序中,我以类似的方式使用JPA存储库来创建/更新/删除数据库中的记录,一切正常。我对这个具体的例子有问题。@ChiefTwoPencils:我在表单中没有使用id-我在表单中只有一个用于更改phone变量的输入。我确信包括id在内的完整用户会在返回时与用户一起返回,对吗?这篇文章的内容是什么?我对sqlserver2008也有类似的问题,请尝试GenerationType.IDENTITY。