Пытаюсь выполнить отображение сущности
Student
на несколько таблиц:
students
,
addresses
,
hobbies
. Ключи в таблицах
addresses
и
hobbies
являются также внешними и ссылаются на первичный ключ таблицы
students
. То есть, таблица
students
основная, а остальные - вспомогательные. Вот описания классов:
Studentpackage entity;
import javax.persistence.*;
@Entity
@Table(name = "students")
@SecondaryTables({
@SecondaryTable(name = "hobbies"),
@SecondaryTable(name = "addresses"),
})
public class Student {
@Id
@Column(name = "student_id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@Column(table = "hobbies")
private String hobby;
@Column(table = "addresses")
@Embedded
private Address address;
public Student(){}
public Student(String name, String hobby, Address address){
this.name = name;
this.hobby = hobby;
this.address = address;
}
}
Addresspackage entity;
import javax.persistence.*;
@Embeddable
public class Address {
@Column(name="street")
private String street;
public Address(){}
public Address(String street){
this.street = street;
}
}
В результате, поле
String hobby
класса
Student
отображается в отдельную таблицу
hobbies
без проблем, а вот
Address address
отобразить не получается. То есть таблица
addresses
создаётся, и внешний ключ в ней прописан, но данные не поступают (таблица пустая). Кроме того, в таблице
addresses
присутствует только одно поле -
student_id
, а поле
street
почему-то отсутствует.
Создаются данные как-то так:
public static void main(String[] args) {
StudentService service = new StudentService();
try {
Student student = service.create(
new Student("Вася", "Лыжи", new Address("ул. Ленина"))
);
Student student2 = service.create(
new Student("Петя", "Хоккей", new Address("ул. Фрунзе"))
);
} catch (DBException e){
System.out.println("что-то пошло не так");
}
DBService.close();
}
Это слой сервиса:
package service;
import dao.*;
import exception.DBException;
import entity.Student;
import org.hibernate.HibernateException;
import org.hibernate.Transaction;
import javax.persistence.NoResultException;
public class StudentService {
public StudentService(){}
public Student create(Student student) throws DBException {
Transaction transaction = DBService.getTransaction();
try {
StudentDao studentDao = DaoFactory.getStudentDao();
Long studentId = studentDao.create(student);
student = studentDao.get(studentId);
transaction.commit();
return student;
} catch (HibernateException | NoResultException | NullPointerException e) {
DBService.transactionRollback(transaction);
throw new DBException(e);
}
}
}
Почему таблица
addresses
пустая и как сделать так, чтобы у неё была правильная структура (было поле
street
) и она заполнялась данными? При выполнении никаких предупреждений или ошибок нет (но отсутствуют запросы на вставку данных в таблицу
addresses
):
Hibernate: drop table addresses if exists
Hibernate: drop table hobbies if exists
Hibernate: drop table students if exists
Hibernate: create table addresses (student_id bigint not null, primary key (student_id))
Hibernate: create table hobbies (hobby varchar(255), student_id bigint not null, primary key (student_id))
Hibernate: create table students (student_id bigint generated by default as identity, street varchar(255), name varchar(255), primary key (student_id))
Hibernate: alter table addresses add constraint FKqq1nt3g94upydb2qt72xhnk7y foreign key (student_id) references students
Hibernate: alter table hobbies add constraint FKmcdfc4qw94xl2a8ak5kct6rys foreign key (student_id) references students
мар 15, 2019 5:43:34 PM org.hibernate.tool.schema.internal.SchemaCreatorImpl applyImportSources
INFO: HHH000476: Executing import script 'org.hibernate.tool.schema.internal.exec.ScriptSourceInputNonExistentImpl@3d9f6567'
Hibernate: insert into students (student_id, street, name) values (null, ?, ?)
мар 15, 2019 5:43:34 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl stop
INFO: HHH10001008: Cleaning up connection pool [jdbc:h2:./h2db]
Hibernate: insert into hobbies (hobby, student_id) values (?, ?)
Hibernate: select student_id from students where student_id =? for update
Hibernate: insert into students (student_id, street, name) values (null, ?, ?)
Hibernate: insert into hobbies (hobby, student_id) values (?, ?)
Hibernate: select student_id from students where student_id =? for update
Process finished with exit code 0