Я изучаю 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;
}