在我的项目中,管理员(用户)可以设置接收有关他选择的任何用户的预定电子邮件。
我需要有以下设计的数据库:
TABLE User (
UserId INT PRIMARY KEY AUTO_INCREMENT,
Email VARCHAR,
FirstName VARCHAR,
LastName VARCHAR
IsAdmin BOOL,
...
)
TABLE Email_Schedule (
ScheduleId INT PRIMARY KEY AUTO_INCREMENT, /* this is not necessary */
AdminId INT, /* could be replaced by a composite foreign primary keys */
UserId INT,
FOREIGN KEY (AdminId) REFERENCES User (UserId),
FOREIGN KEY (UserId) REFERENCES User (UserId)
)
我的JPA实体Java类中的以下代码:
@Entity
public class Email_Schedule {
@Id
private int scheduleId;
@ManyToOne(targetEntity = User.class)
private List<User> admins = new LinkedList<>();
@ManyToOne(targetEntity = User.class)
private List<User> users = new LinkedList<>();
public Email_Schedule() {
super();
}
public Email_Schedule(User admin, User user) {
super();
this.admins.add(admin);
this.users.add(user);
}
// setters and getters...
生成以下架构的数据库:
TABLE USER (
...
)
TABLE SCHEDULE (
ScheduleId INT PRIMARY KEY AUTO_INCREMENT
)
TABLE Email_Schedule (
ScheduleId INT,
Users INT,
Admins INT,
FOREIGN KEY (ScheduleId) REFERENCES SCHEDULE(ScheduleId),
FOREIGN KEY (Users) REFERENCES USER (UserId),
FOREIGN KEY (Admins) REFERENCES USER (UserId)
)
我的问题是为什么它为ScheduleId
创建一个无用的表并从另一个表引用它而不是直接在Email_Schedule
表中使用它?
问题似乎与ScheduleId
有关。我尝试不通过创建IdClass
来使用它,但我得到了不同的错误和错误的数据库设计。
答案 0 :(得分:0)
EclipseLink使用TABLE
生成scheduleId
的序列。
这似乎是默认的。
您可以在任何数据库上使用表格生成标识符。这个 策略完全可以跨数据库移植,将是 在启用模式生成时自动为您生成。
根据EclipseLink文档,您可能必须使用IDENTITY
scheduleId
的生成策略来避免TABLE
appraoch。
@GeneratedValue(strategy=GenerationType.IDENTITY)
请注意,如果您使用AUTO
策略,如下所示,那么即使在这种情况下,EclipseLink也可能选择TABLE
策略来生成ID。
@GeneratedValue(strategy=GenerationType.AUTO)
使用默认生成策略
指定AUTO策略 允许EclipseLink选择要使用的策略。通常情况下, EclipseLink选择TABLE作为策略,因为它是最便携的 战略。但是,指定AUTO时,必须生成模式 至少使用一次,以便在。中创建默认表 数据库中。
此处有PrimaryKey和GeneratedValue文档
的详细信息