2015-07-19 5 views
3

В моем проекте администратор (Пользователь) может настроить получение запланированных писем о любом пользователем, которого он выбирает.Объекты 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) 
) 

Следующий код в моих Java классов для JPA лица:

@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

Какой инструмент вы использовали для DDL поколения? –

+0

@DraganBozanovic Eclipse, инструмент JPA, генерирует таблицы из объектов. Затем я проверил сгенерированные таблицы в workbench MySQL. –

+0

Не могли бы вы попытаться использовать hbm2ddl напрямую? –

ответ

0

EclipseLink использует TABLE для генерации последовательности для scheduleId. Это похоже на значение по умолчанию.

Вы можете использовать таблицу для генерации идентификатора в любой базе данных. Эта стратегия полностью переносима по базам данных, и будет , автоматически сгенерированный для вас при активации схемы.

Согласно EclipseLink документации, вы, возможно, придется использовать стратегию генерации IDENTITY для scheduleId, чтобы избежать TABLE appraoch.

@GeneratedValue(strategy=GenerationType.IDENTITY) 

Обратите внимание, что если использовать AUTO стратегию, как показано ниже, то, даже в том случае, EclipseLink может выбрать стратегию TABLE для генерации ID.

@GeneratedValue(strategy=GenerationType.AUTO) 

Использование по умолчанию Стратегия поколения

Задание стратегии AUTO позволяет EclipseLink выбрать стратегию использования. Как правило, EclipseLink выбирает ТАБЛИЦУ как стратегию, поскольку это самая портативная стратегия . Однако, когда указано AUTO, генерация схемы должна быть , используемой хотя бы один раз, чтобы таблица по умолчанию была создана в базе данных .

Более подробно здесь на PrimaryKey и GeneratedValue Документация

+0

можете ли вы предложить ответ, который не использует scheduleId? –

+0

Какую базу данных вы используете? Вы указываете значение для eclipselink.target-database? –

+0

Я использую MySQL, и нет, я не использую 'target-database' –

Смежные вопросы