为数据库设计 JPA 实体 Table

Designing JPA Entity for Database Table

我正在设计一个投票应用程序并设计了一个包含 2 tables - 州和地区的数据库。 两个 table 是 -

状态详细信息table

State_ID 数字(3)

State_name VARCHAR2(30)

主键(State_ID)

学区详情table

District_ID 数字(3)

State_ID 数字(3)

District_name VARCHAR2(30)

PIN_Code 数字(6)

主键(District_ID)

唯一(State_ID,District_name)

外键(State_ID)

由于两个州可以有一个同名的地区,我认为州 ID 和地区名称的组合是唯一的组合。

现在我必须为这两个 table 设计 JPA 实体,但我无法设计,因为在数据库设计中,地区 table 有状态 ID 作为外键,但是当涉及到在 District 中设计具有 State 对象的实体时,这听起来毫无意义,因为如果我在脑海中保留 HAS-A 关系,那么 District 中就没有 State州有一个选区列表。这不符合上面的数据库设计。

有人可以帮我为此设计 JPA 实体吗?请建议数据库设计是否也需要修改。 谢谢

CREATE TABLE States (
    code CHAR(2) NOT NULL CHARACTER SET ascii,
    name VARCHAR(30) NOT NULL,
    PRIMARY KEY(code)
);
CREATE TABLE Districts
    id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
    state_code CHAR(2) NOT NULL CHARACTER SET ascii,
    ...
    PRIMARY KEY(id),
    UNIQUE (state_code, name)
);

备注:
* 如果您谈论的是美国,也可以使用标准州代码(AK、AL、...)。
* States 的唯一目的可能是拼出名字。
* 如果您的 table 默认为 utf8.
,我明确说明了 ascii * MySQL 使用 VARCHAR,而不是 VARHAR2。
* 你 可以 摆脱 Districts.id 而只拥有 PRIMARY KEY(state_code, name),但我猜你还有很多其他 table 需要加入对于这个,2 字节 id 会比笨重的替代方案更好。

基于 的示例 JPA 方法:

@Entity
@Table(name = "States")
public class State {
    @Id
    @Column(nullable = false, columnDefinition = "CHAR(2) CHARACTER SET ascii")
    private String code;

    @Column(nullable = false, length = 30)
    private String name;

    @OneToMany(mappedBy = "state")
    private Collection<District> districts;

    public State() { }

    // getters, setters, etc.
}
@Entity
@Table(name = "Districts", uniqueConstraints = { 
    @UniqueConstraint(columnNames = { "state_code", "name" })
})
public class District {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(nullable = false, columnDefinition = "SMALLINT UNSIGNED")
    private short id;

    @Column(name = "state_code", nullable = false, 
            columnDefinition = "CHAR(2) CHARACTER SET ascii")
    private String code;

    @Column(length = 30)
    private String name;

    @ManyToOne
    @JoinColumn(name = "state_id")
    private State state;

    public District() { }

    // getters, setters, etc.
}

注意:由于使用了 columnDefinition 属性,上述实体不能跨数据库移植。