Двунаправленное отображение и сохранение нескольких объектов - PullRequest
0 голосов
/ 21 февраля 2020

У меня есть две таблицы Student и Address таблица. Я хочу двунаправленное отображение между ними. Второе, что мне нужно, это то, что адрес автоматически добавляется от объекта учащегося, когда адрес находится в классе учащегося.

Двунаправленное сопоставление достигается с помощью этого кода:

@Entity
class Student {

    @Id
    private long id;

    @OneToMany(cascade = CascadeType.ALL,mappedBy = "student")
    private Address address;
}

@Entity
class Address {

    @Id
    private long id;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "student_id")
    private Student student;
}

Второй случай достигается этим кодом, но двунаправленное сопоставление не выполняется:

@Entity
class Student {

    @Id
    private long id;

    @OneToMany(cascade = CascadeType.ALL)
    @JoinColumn(name = "student_id",referencedColumnName = "id")
    private Address address;
}

@Entity
class Address {

    @Id
    private long id;
}

Есть ли способ получить двунаправленное сопоставление и добавить адрес от студента?

Ответы [ 2 ]

0 голосов
/ 21 февраля 2020

Прежде всего, вы должны использовать коллекцию на стороне @OneToMany:

@OneToMany(cascade = CascadeType.ALL,mappedBy = "student")
private List<Address> address;

Второе, что мне нужно, это то, что адрес автоматически добавляется из объекта учащегося, когда адрес в классе ученика.

Этого можно добиться только с помощью улучшения байт-кода (см. Управление двунаправленной связью раздел). За это отвечает опция hibernate.enhancer.enableAssociationManagement.

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

0 голосов
/ 21 февраля 2020

В Student у вас есть @OneToMany Address. Это означает, что вы говорите Hibernate, что у одного ученика может быть много адресов.

Так и должно быть:

class Student {
    @OneToMany(cascade = CascadeType.ALL,mappedBy = "student")
    private List<Address> addressList;
}

А так как отношение между Address и Student является многозначным, то один адрес может иметь только одного ученика.

class Address {
    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "student_id")
    private Student student;
}

Учитывая это, ваша реализация save может выглядеть следующим образом:

Student student = new Student();
Address address = new Address();

address.setStudent(student);
student.setAddressList(Collections.singletonList(student));

studentRepository.save(student);
//addressRepository.save(address); or use AddressRepository
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...