【问题标题】:Hibernate - return an object based on two entities using primary and foreign keysHibernate - 使用主键和外键返回基于两个实体的对象
【发布时间】:2017-08-12 10:27:02
【问题描述】:

在我的 mysql 数据库中,我有两个表“用户”和“电子邮件”。 “email_id”列是“用户”表中的外键

我想使用 hibernate JPA 返回一个 Object,其中包含用户的所有详细信息及其电子邮件地址,基于 中提供的 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 文档,但无法实现。
  • "检查了 JPA 文档" ... 对。像这样的? datanucleus.org/products/accessplatform_5_1/jpa/… 因为它足够简单怎么做
  • 文档没有显示如何实现该方法
  • 关心与世界分享什么是“方法”?链接的页面告诉您如何在 JPA 中实现 1-1 关系,这在您的帖子中没有做过。

标签: hibernate jpa spring-boot persistence


【解决方案1】:

检查这个,https://gigsterous.github.io/engineering/2016/09/25/spring-boot-2.html 使用注释来创建实体之间的关系。

【讨论】:

    猜你喜欢
    • 2014-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-28
    • 1970-01-01
    • 2018-11-30
    • 1970-01-01
    相关资源
    最近更新 更多