【问题标题】:How can I implement an Enum with JPA using separate Mysql Tables如何使用单独的 Mysql 表使用 JPA 实现枚举
【发布时间】:2021-05-14 17:54:55
【问题描述】:

我真的是使用 JPA 的新手,但仍然不知道如何实现这一点,我很乐意提供任何建议或解决方案。

Mysql 表:

CREATE TABLE REAL_STATE_TYPES (
real_state_type_id INT(6) NOT NULL,
real_state_type VARCHAR(50) NOT NULL,
PRIMARY KEY (real_state_type_id)
);

CREATE TABLE REAL_STATES (
address VARCHAR(30) NOT NULL,
admin_id VARCHAR(15) NOT NULL,
real_state_type_id INT(6) NOT NULL,
block VARCHAR(3) NOT NULL,
internal_id INT(5) NOT NULL,
PRIMARY KEY (address, block, internal_id),
FOREIGN KEY (real_state_type_id) REFERENCES REAL_STATE_TYPES (real_state_type_id),
FOREIGN KEY (admin_id) REFERENCES ADMINS (admin_id)
);

所以 REAL_STATE 的 id 是 REAL_STATE_TYPE,如果我想保持这个表的关系,我如何通过 JPA 将它们映射到 java 代码中。

我的 java 类是:

import javax.persistence.Enumerated;
import javax.persistence.Id;
import javax.persistence.OneToOne;
import javax.persistence.Table;

@Entity
@Table(name= "real_state_types")
public class RealStateType implements Serializable{

    private static final long serialVersionUID = 5442745398170857199L;
    @Id
    @Column(name= "real_state_type_id ")
    private int realStateTypeId;
    @Column(name= "real_state_type")
    @Enumerated(EnumType.STRING)
    private RealStateEnum realStateType;
    @OneToOne(mappedBy = "realStateType", cascade = {CascadeType.ALL})
    private RealState realState;

还有:

import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.Enumerated;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

@Entity
@Table(name = "real_states")
public class RealState {
    @EmbeddedId
    private RealStateID realStateID;
    @Column(name = "real_state_type_id")
    private RealStateType realStateType;
    @ManyToOne
    @JoinColumn(name = "admin_id")
    private Admin admin;
}

【问题讨论】:

    标签: java mysql hibernate jpa enums


    【解决方案1】:

    为了让它工作,我相信你需要 1. 删除

    @OneToOne(mappedBy = "realStateType", cascade = {CascadeType.ALL})
    private RealState realState;
    

    来自 RealStateType。 2.改变

    @Column(name = "real_state_type_id")
    private RealStateType realStateType;
    

    进入

    @JoinColumn(name = "real_state_type_id")
    private RealStateType realStateType;
    

    在 RealState 中。

    否则,如果可能,我会删除 RealStateType @Entity 并使用

    @Enumerated(EnumType.STRING)
    @Column(name = "real_state_type", nullable = false)
    private RealStateEnum realStateType;
    

    真实状态

    【讨论】:

      猜你喜欢
      • 2020-02-29
      • 2019-10-09
      • 2012-08-24
      • 2010-09-26
      • 2014-12-04
      • 2011-08-28
      • 2014-02-21
      • 1970-01-01
      • 2018-04-11
      相关资源
      最近更新 更多