为数据库设计 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
属性,上述实体不能跨数据库移植。
我正在设计一个投票应用程序并设计了一个包含 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
会比笨重的替代方案更好。
基于
@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
属性,上述实体不能跨数据库移植。