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

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

Войти через центр авторизации
Похожие вопросы
RBS Payments Москва
от 150 000 до 200 000 руб.
Litota Labs Ульяновск
от 110 000 руб.
SLEKI Санкт-Петербург
от 80 000 до 120 000 руб.
22 марта 2019, в 06:30
10000 руб./за проект
22 марта 2019, в 03:12
20000 руб./за проект
22 марта 2019, в 01:06
4000 руб./за проект