gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 09:05:40 30 4
gpt4 key购买 nike

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

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

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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com