【问题标题】:Fetch result in case of many to many relationship在多对多关系的情况下获取结果
【发布时间】:2015-11-28 10:56:16
【问题描述】:

我有三张桌子

  1. 员工:存储员工信息

  2. role_description:存储我拥有的角色类型,例如管理员、区域经理、国家经理

  3. employee_role_details:从员工和角色描述中具有多对多关系以及一些额外的字段。

现在我在从员工表中获取包含 (employee_id, email) 的结果时遇到问题,从employee_role_details 中获取 (role_ownership, role_id) 以及从对应于 role_description 中的角色 ID 的角色描述中获取 (role_name 和角色描述)。

Employee.java

@Entity
@Table(name = "employee", uniqueConstraints= @UniqueConstraint(columnNames={"employee_email"}))
public class Employee {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "employee_id")
    private long employeeId;

    @Column(name = "employee_name")
    private String employeeName;

    @Column(name = "employee_email", unique = true, nullable = false)
    private String employeeEmail;

    @Column(name = "contact_no")
    private String contactNo;

    @Column(name = "password")
    private String password;

    @Column(name = "is_active")
    private Boolean isActive = true;

    @Transient
    private long EmployeeRoleId;

    @Transient
    private String roleName;

    @Transient
    private int totalpage;

    @OneToMany(mappedBy = "employee", cascade = CascadeType.ALL)
    //@JsonIgnore
    @JsonManagedReference(value = "employeeRoleRecord-employee")
    @LazyCollection(LazyCollectionOption.FALSE)
    private List<EmployeeRoleRecord> roleRecords = new ArrayList<>();

    @OneToMany(mappedBy = "assignedTo", cascade = CascadeType.ALL)
    @JsonManagedReference(value = "complaint-treatment-employee")
    @LazyCollection(LazyCollectionOption.FALSE)
    private List<ComplaintsCategory> complaintCategoryAssignedTo = new ArrayList<>();

EmployeeDescription.java

@Entity
@Table(name = "role_description")
public class RoleDescription {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "role_id")
    private long roleId;

    @Column(name = "role_name")
    private String roleName;

    @Column(name = "role_description")
    private String roleDescription;

    @Column(name = "status")
    private boolean status;

    @OneToMany(mappedBy = "description", cascade = CascadeType.ALL)
    @JsonManagedReference(value = "employeeRoleRecord-roleDescription")
    @LazyCollection(LazyCollectionOption.FALSE)
    private List<EmployeeRoleRecord> roleRecords = new ArrayList<EmployeeRoleRecord>();

员工角色记录

@Entity
@Table(name = "employee_role_record")
public class EmployeeRoleRecord {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "employee_role_id")
    private long employeeRoleId;

    @Column(name = "role_ownership")
    private String roleOwnership;

    @Column(name = "status")
    private boolean status = true;


    @ManyToOne(cascade=CascadeType.ALL)
    @JsonBackReference(value = "employeeRoleRecord-employee")
    @JoinColumn(name = "employee_id")
    private Employee employee;

    @ManyToOne(cascade=CascadeType.ALL)
    @JsonBackReference(value = "employeeRoleRecord-roleDescription")
    @JoinColumn(name = "role_id")
    private RoleDescription description;

    @Transient
    private long roleId;

dao 内的代码

public Employee getEmployeeByEmail(String email) {
        return (Employee) sessionFactory.getCurrentSession()
                .createCriteria(Employee.class)
                .add(Restrictions.eq("employeeEmail", email)).uniqueResult();
    }

服务:

public Employee getSurveyData(String employeeEmail){

        Employee loggedInEmployee =
                 loginDao.getEmployeeByEmail(employeeEmail);

        Employee  loggedInEmployeeRecord = new Employee();

            loggedInEmployeeRecord.setEmployeeId(loggedInEmployee.getEmployeeId());
            loggedInEmployeeRecord.setEmployeeName(loggedInEmployee.getEmployeeName());

            List<EmployeeRoleRecord> employeeRoleRecords = loggedInEmployee.getRoleRecords();

            List<EmployeeRoleRecord> employeeRoleRecord = new  ArrayList<>();

            for(EmployeeRoleRecord record :  employeeRoleRecords){

                EmployeeRoleRecord employeeRole = new EmployeeRoleRecord();

                employeeRole.setRoleId(record.getDescription().getRoleId());
                employeeRole.setRoleName(record.getDescription().getRoleName());
                employeeRole.setRoleOwnership(record.getRoleOwnership());
                employeeRole.setStatus(record.isStatus());
                employeeRoleRecord.add(employeeRole);
            }

            loggedInEmployeeRecord.setRoleRecords(employeeRoleRecord);


         return loggedInEmployee;
    }

输出:

    {
  "employeeId": 1,
  "employeeName": "Dhyanandra Singh",
  "employeeEmail": "admin",
  "contactNo": "9893651872",
  "password": "123456",
  "isActive": true,
  "roleRecords": [
    {
      "employeeRoleId": 1,
      "roleOwnership": "overall project",
      "status": true,
      "roleId": 0,
      "roleName": null
    }
  ],
}

问题:

我得到的 json 输出在角色记录列表中不包含角色 ID 和角色名称。

【问题讨论】:

    标签: java hibernate many-to-many hibernate-mapping foreign-key-relationship


    【解决方案1】:

    问题是:

    EmployeeRoleRecord 类上的 roleId 属性映射为@Transient,这意味着它没有持久化到数据库中,因此 Hibernate 无法获取该字段的结果。

    查看您的类建模,我无法确定您要使用 roleId 映射的确切内容,我建议两种可能的方法:

    1. 不要在 getEmployeeByEmail 方法上直接返回您的查询。先得到结果,然后迭代,在每条记录上手动设置你想要的roleId;

    2. 检查您的模型方案并为 roleId 进行正确映射,它可能应该引用另一个实体,因此请确保正确映射关系以在单个查询中获得结果。

    祝你好运。

    【讨论】:

    • 在 EmployeeRoleRecord 中我存在多对一映射,因为 RoleDescription 包含 roleId。
    • 我已经尝试过你提到的方法1,但我没有得到roleId可能是因为它是外键。
    • 对于 Hibernate,roleId 不是外键,因为您使用的是“@Transient”注释。前面说了,roleId的映射要正确,否则在获取JSON的时候就无法获取到它的值。
    • 已经有一个映射 @ManyToOne(cascade=CascadeType.ALL) @JsonBackReference(value = "employeeRoleRecord-roleDescription") @JoinColumn(name = "role_id") private RoleDescription description; @Transient private long roleId;
    • 如果我的回答对您有所帮助,请您将其标记为正确答案或点赞吗?无论如何,很高兴听到您的问题得到解决! Hibernate 有时会非常令人沮丧......
    【解决方案2】:

    在 EmployeeRoleRecord 中添加了临时 roleId 和 roleName,然后在服务中进行了一些修改。就像在其中迭代列表设置 roleId 和 roleName 一样。

    public Employee getSurveyData(String employeeEmail){
    
                Employee loggedInEmployee =
                         loginDao.getEmployeeByEmail(employeeEmail);
    
                Employee  loggedInEmployeeRecord = new Employee();
    
                    loggedInEmployeeRecord.setEmployeeId(loggedInEmployee.getEmployeeId());
                    loggedInEmployeeRecord.setEmployeeName(loggedInEmployee.getEmployeeName());
                    loggedInEmployeeRecord.setEmployeeEmail(loggedInEmployee.getEmployeeEmail());
                    loggedInEmployeeRecord.setContactNo(loggedInEmployee.getContactNo());
    
                    List<EmployeeRoleRecord> employeeRoleRecords = loggedInEmployee.getRoleRecords();
    
                    List<EmployeeRoleRecord> employeeRoleRecord = new  ArrayList<>();
    
                    for(EmployeeRoleRecord record :  employeeRoleRecords){
    
                        EmployeeRoleRecord employeeRole = new EmployeeRoleRecord();
    
                        employeeRole.setEmployeeRoleId(employeeRole.getEmployeeRoleId());
                        employeeRole.setRoleId(record.getDescription().getRoleId());
                        employeeRole.setRoleName(record.getDescription().getRoleName());
                        employeeRole.setRoleOwnership(record.getRoleOwnership());
                        employeeRole.setStatus(record.isStatus());
                        employeeRoleRecord.add(employeeRole);
                    }
    
                    loggedInEmployeeRecord.setRoleRecords(employeeRoleRecord);
    
    
                 return loggedInEmployeeRecord;
            }
    

    【讨论】:

      猜你喜欢
      • 2020-06-06
      • 1970-01-01
      • 1970-01-01
      • 2017-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-13
      • 1970-01-01
      相关资源
      最近更新 更多