休眠 - 基于两个实体使用主键和外键返回对象
问题描述:
在我的mysql数据库中,我有两个表“用户”和“电子邮件”。 列“email_id”是表“用户”中的外键。休眠 - 基于两个实体使用主键和外键返回对象
我希望使用Hibernate JPA返回的对象,含有其电子邮件地址的用户,基于用户表中提供的ID的所有细节。
下面是我的表格结构的截图。
表用户:
表电子邮件:
这里是我的Java实体类:
氯屁股用户
package com.concretepage.entity;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "user")
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(name = "user_id")
private int user_id;
@Column(name = "email_id")
private int email_id;
@Column(name = "user_name")
private String user_name;
public User() {
}
public User(int user_id, int email_id, String user_name) {
this.user_id = user_id;
this.email_id = email_id;
this.user_name = user_name;
}
public int getUser_id() {
return user_id;
}
public void setUser_id(int user_id) {
this.user_id = user_id;
}
public int getEmail_id() {
return email_id;
}
public void setEmail_id(int email_id) {
this.email_id = email_id;
}
public String getUser_name() {
return user_name;
}
public void setUser_name(String user_name) {
this.user_name = user_name;
}
}
类电子邮件
package com.concretepage.entity;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "email")
public class Email implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(name = "email_id")
private int email_id;
@Column(name = "email_address")
private String email_address;
public Email() {
}
public Email(int email_id, String email_address) {
this.email_id = email_id;
this.email_address = email_address;
}
public int getEmail_id() {
return email_id;
}
public void setEmail_id(int email_id) {
this.email_id = email_id;
}
public String getEmail_address() {
return email_address;
}
public void setEmail_address(String email_address) {
this.email_address = email_address;
}
}
接口用户定义方法
package com.concretepage.dao;
import java.util.List;
import com.concretepage.entity.*;
public interface IUserDAO {
List<User> getAllUser();
User getUserBy(int userId);
}
接口电子邮件定义方法
package com.concretepage.dao;
import java.util.List;
import com.concretepage.entity.*;
public interface IEmailDAO {
List<Email> getAllEmails();
Email getEmailById(int emailId);
}
接口的实现用户
package com.concretepage.dao;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import com.concretepage.entity.*;
@Transactional
@Repository
public class UserDAO implements IUserDAO {
@PersistenceContext
private EntityManager entityManager;
@Override
public List<User> getAllUser() {
String hql = "FROM User as user ORDER BY user.user_id";
return (List<User>) entityManager.createQuery(hql).getResultList();
}
@Override
public User getUserBy(int userId) {
return entityManager.find(User.class, userId);
}
}
接口的实现电子邮件
package com.concretepage.dao;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import com.concretepage.entity.*;
@Transactional
@Repository
public class EmailDAO implements IEmailDAO {
@PersistenceContext
private EntityManager entityManager;
@Override
public List<Email> getAllEmails() {
String hql = "FROM Email as email ORDER by email.email_id";
return (List<Email>) entityManager.createQuery(hql).getResultList();
}
@Override
public Email getEmailById(int emailId) {
return entityManager.find(Email.class, emailId);
}
}
控制器类来调用服务
package com.concretepage.controller;
import com.concretepage.dao.IUserDAO;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import com.concretepage.entity.*;
@Controller
@RequestMapping("user")
public class UserController {
@Autowired
private IUserDAO userService;
@GetMapping("users")
public ResponseEntity<List<User>> getAllUser() {
List<User> list = userService.getAllUser();
return new ResponseEntity<>(list, HttpStatus.OK);
}
@GetMapping("users/{id}")
public ResponseEntity<User> getUserBy(@PathVariable("id") Integer id) {
User user = userService.getUserBy(id);
return new ResponseEntity<>(user, HttpStatus.OK);
}
}
我需要Id = 1的用户的电子邮件地址和他的名字。
如果有东西是外键,那么你需要在它所表示的字段上有一个RELATION(例如'@ OneToOne')。任何JPA文档都会告诉你如何。 –
我在哪里把@OneToOne关系?你能举个例子吗?检查了JPA文档,但无法实现它。 – Shaam
“在JPA文档中检查”...正确。像这些? http://www.datanucleus.org/products/accessplatform_5_1/jpa/mapping.html#one_one_relations,因为它足够简单,如何做到这一点 –