Почему Hibernate выполнить запрос на изменение, чтобы добавить внешний ключ - PullRequest
0 голосов
/ 27 ноября 2018

Я изучаю JPA-учебник о @ OneToMany.

Когда программа запускалась, журнал гибернации показывал код, приведенный ниже.

Hibernate: 
create table Member (
   id bigint not null,
    age integer not null,
    USERNAME varchar(255),
    TEAM_ID bigint,
    primary key (id)
)

Hibernate:     
create table Team (
   id bigint not null,
    name varchar(255),
    primary key (id)
)

Hibernate: 
alter table Member 
   add constraint FKl7wsny760hjy6x19kqnduasbm 
   foreign key (TEAM_ID) 
   references Team

Здесь я задавался вопросом, почему для перехода в режим гибернации используйте запрос alter, чтобы добавитьвнешний ключ?

Если это хорошо, я хочу знать, почему изменение запроса лучше, чем создание запроса для добавления внешнего ключа.

// 1. Create table with foreign key

create table Member (
   id bigint not null,
    age integer not null,
    USERNAME varchar(255),
    TEAM_ID bigint,
    primary key (id),
    foreign key (TEAM_ID) references Team(id)
)


// 2. Create table and Alter table for foreign key

create table Member (
   id bigint not null,
    age integer not null,
    USERNAME varchar(255),
    TEAM_ID bigint,
    primary key (id)
)

alter table Member 
   add constraint FKl7wsny760hjy6x19kqnduasbm 
   foreign key (TEAM_ID) 
   references Team

Это мой файл persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" version="2.2">
<persistence-unit name="hello">
    <properties>
        <property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
        <property name="javax.persistence.jdbc.user" value="sa"/>
        <property name="javax.persistence.jdbc.password" value=""/>
        <property name="javax.persistence.jdbc.url" value="jdbc:h2:tcp://localhost/~/test"/>
        <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect" />
        <property name="hibernate.show_sql" value="true" />
        <property name="hibernate.format_sql" value="true" />
        <property name="hibernate.use_sql_comments" value="true" />
        <property name="hibernate.hbm2ddl.auto" value="create" />
    </properties>
</persistence-unit>

Командный класс

@Entity
public class Team {
    @Id @GeneratedValue
    private Long id;
    private String name;

    @OneToMany(mappedBy = "team")
    private List<Member> members = new ArrayList<>();
}

Класс участника

@Entity
public class Member {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(name = "USERNAME")
    private String name;
    private int age;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "TEAM_ID")
    private Team team;
}

1 Ответ

0 голосов
/ 27 ноября 2018

Основная причина создания внешних ключей после таблиц заключается в том, что вам не нужно правильно определять порядок операторов CREATE TABLE.Если вы используете «встроенную» версию для определения внешнего ключа, ссылочная таблица должна быть создана перед ссылочной таблицей.

Если после создания всех таблиц все FK создаются как операторы ALTER TABLE, порядок создания таблиц не имеет значения.

Этот шаблон создает кодчто генерирует DDL легче писать.

В случае, если в определениях FK есть некоторые циклические ссылки (что не является хорошим дизайном, но бывает), это единственный способ определить таблицы и внешние ключи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...