JPA实体生成错误的数据库设计

时间:2015-07-19 08:09:41

标签: java mysql jpa

在我的项目中,管理员(用户)可以设置接收有关他选择的任何用户的预定电子邮件。

我需要有以下设计的数据库:

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来使用它,但我得到了不同的错误和错误的数据库设计。

1 个答案:

答案 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时,必须生成模式   至少使用一次,以便在。中创建默认表   数据库中。

此处有PrimaryKeyGeneratedValue文档

的详细信息