2017-08-12 89 views
-1

在我的mysql数据库中,我有两个表“用户”和“电子邮件”。 列“email_id”是表“用户”中的外键休眠 - 基于两个实体使用主键和外键返回对象

我希望使用Hibernate JPA返回的对象,含有其电子邮件地址的用户,基于用户表中提供的ID的所有细节。

下面是我的表格结构的截图。

用户

Table User

电子邮件

enter image description here

这里是我的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的用户的电子邮件地址和他的名字。

下面是预期目标的截图: enter image description here

+0

如果有东西是外键,那么你需要在它所表示的字段上有一个RELATION(例如'@ OneToOne')。任何JPA文档都会告诉你如何。 –

+0

我在哪里把@OneToOne关系?你能举个例子吗?检查了JPA文档,但无法实现它。 – Shaam

+0

“在JPA文档中检查”...正确。像这些? http://www.datanucleus.org/products/accessplatform_5_1/jpa/mapping.html#one_one_relations,因为它足够简单,如何做到这一点 –

回答