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

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

最佳答案

EclipseLink 使用 TABLEscheduleId 生成序列。 这似乎是默认设置。

You can use a table for identifier generation on any database. This strategy is completely portable across databases and will be automatically generated for you when schema generation is enabled.

根据 EclipseLink文档,您可能必须为 scheduleId 使用 IDENTITY 的生成策略来避免 TABLE 方法。

@GeneratedValue(strategy=GenerationType.IDENTITY)

请注意,如果您使用如下所示的 AUTO 策略,那么即使在这种情况下,EclipseLink 也可能会选择 TABLE 策略来生成 ID。

@GeneratedValue(strategy=GenerationType.AUTO)

Using a Default Generation Strategy

Specifying a strategy of AUTO allows EclipseLink to select the strategy to use. Typically, EclipseLink picks TABLE as the strategy, since it is the most portable strategy. However, when AUTO is specified, schema generation must be used at least once in order for the default table to be created in the database.

更多详细信息,请访问 PrimaryKeyGeneratedValue文档

关于java - JPA 实体生成错误的数据库设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31499196/

相关文章:

php - 在 PHP 和 MySQL 中确定和存储打卡时间的最佳方法

java - JPA 时间戳列和 net.sf.json 查询结果

java - MySQL 或 Hibernate 缓存问题接收旧数据

java - 如何对实现 Runnable 的类进行单元测试

java - 更改 eclipse 中的 System.in 以从文件中读取

java - 使用 Jackson 根据 API 版本指定不同的 JSON 属性名称

mysql - 如何处理数据库模式中的用户权限?

mysql - 如何在 Laravel Eloquent ORM 中使用数据库特定函数进行模块化使用

JPA Criteria API 缺失

java - 无法解决索引超出范围错误