Задать вопрос
@woodhead

Как сделать отображение сущности на несколько таблиц в Hibernate?

Пытаюсь выполнить отображение сущности Student на несколько таблиц: students, addresses, hobbies. Ключи в таблицах addressesи hobbiesявляются также внешними и ссылаются на первичный ключ таблицы students. То есть, таблица studentsосновная, а остальные - вспомогательные. Вот описания классов:

Student

package 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;
    }
}


Address

package 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
  • Вопрос задан
  • 299 просмотров
Подписаться 2 Простой 1 комментарий
Пригласить эксперта
Ответы на вопрос 1
driversti
@driversti
Кратко о себе
На сколько мне известно, @Embedded указывает на то, что этот объект будет сохранён в таблице родителя (по-крайней мере у меня так в проекте). То есть, столбец street будет находится в таблице students там же заполнятся. Проверьте данные в таблице students
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы