为数据库表设计JPA实体

时间:2015-03-06 14:51:42

标签: mysql database hibernate jpa entity

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

州详细信息表

State_ID NUMBER(3)

State_name VARCHAR2(30)

PRIMARY KEY(State_ID)

地区详情表

District_ID NUMBER(3)

State_ID NUMBER(3)

District_name VARCHAR2(30)

PIN_Code NUMBER(6)

PRIMARY KEY(District_ID)

UNIQUE(State_ID,District_name)

FOREIGN KEY(State_ID)

由于两个州可以有一个同名的地区,我正在考虑将国家身份证和地区名称组合为UNIQUE的组合。

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

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

2 个答案:

答案 0 :(得分:1)

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的唯一目的可能是说明这个名字  *如果您的表默认为utf8,我明确指出了ascii  * MySQL使用VARCHAR,而不是VARHAR2  *你可以摆脱Districts.id而只是PRIMARY KEY(state_code, name),但我猜你有很多其他表需要加入这个表,而且是2字节id会比庞大的替代品更好。

答案 1 :(得分:1)

基于Rick's proposal的示例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属性,上述实体无法跨数据库移植。

相关问题