【发布时间】:2015-07-19 08:09:40
【问题描述】:
在我的项目中,管理员(用户)可以设置为接收有关他选择的任何用户的预定电子邮件。
我需要一个如下设计的数据库:
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 不使用它,但我遇到了不同的错误和错误的数据库设计。
【问题讨论】:
-
你用什么工具来生成ddl?
-
@DraganBozanovic Eclipse,JPA 工具,从实体生成表。然后,我在 MySQL 工作台中检查了生成的表。
-
可以直接用hbm2ddl试试吗?
-
恕我直言,您的设计错误与列表结构有关,Email_Schedule 类型的对象(实例)应该与用户和管理员具有一对一(一对多)关系。跨度>
-
@rz3r0:但您的问题之上的要求禁止这种方法。它为每个用户和管理员定义了一个 scheduleId。