Используется только @mappedBy, нет @ JoinColumn - столбец соединения, созданный в отношении OneToMany, в чем тогда смысл использования JoinColumn? - PullRequest
0 голосов
/ 23 февраля 2019

Я новичок в Hibernate.У меня есть отношения OneToMany с двусторонним отображением между Учетной записью и Транзакцией.Я не использую @JoinColumn ни в одном классе, и не использую @mappedBy в не принадлежащем классу Account.И все работает нормально.Используя H2 в базе данных памяти, новый столбец соединения создается в таблице транзакций.Тогда зачем использовать @JoinColumn в отношениях OneToMany - только для однонаправленного отображения?Ниже приведен код.Я также читаю для справки В чем разница между @JoinColumn и mappedBy при использовании ассоциации JPA @OneToMany

  public class Account {
        @OneToMany( mappedBy="account", cascade=CascadeType.ALL)
        List<Transaction> list= new ArrayList<Transaction>();
    }

    public class Transaction {

        @ManyToOne
        Account account;
    }

Класс приложения:

        Account a = new Account("savings");

        Transaction t1 = new Transaction("shoe purchase", 45);

        t1.setAccount(a);

        a.getList().add(t1);

        accountRepository.save(a);

вывод:

В таблице транзакций есть запись с внешним ключом, который является номером счета в одной строке таблицы счетов.Столбец ACCOUNT_ID создан в таблице транзакций.

Дополнительные таблицы не созданы.

Ответы [ 3 ]

0 голосов
/ 23 февраля 2019

Jpa работает над идеей конфигурации по договоренности.Таким образом, он будет выполнять настройку от вашего имени, когда это возможно.Вспомните аннотацию @Column, вам не нужно применять ее к каждому атрибуту сущности, она понадобится вам только тогда, когда вам нужно что-то изменить в атрибутах.

То же самое с @JoinColumn,когда вы добавили @ManyToOne, Jpa уже знает, что вам понадобится столбец объединения, и поэтому он был добавлен для вас, и для внешнего ключа было применено соглашение о присвоении имен по умолчанию (attributename_primarykeyoftheothertype).

0 голосов
/ 23 февраля 2019

MappedBy сообщает Hibernate, что ключ, используемый для ассоциации, находится на другой стороне ассоциации. Как и в этом случае, ACCOUNT_ID создается в таблице Account.

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

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

0 голосов
/ 23 февраля 2019

Использование

mappedBy

является инструктивной структурой для включения двунаправленного взаимодействия.Из-за @ManyToOne класса Transaction у вашей таблицы транзакций будет внешний ключ, относящийся к первичному ключу таблицы Account.По умолчанию Hibernate генерирует имя столбца внешнего ключа на основе имени атрибута сопоставления отношений и имени атрибута первичного ключа.В этом примере Hibernate будет использовать столбец с именем account_id для хранения внешнего ключа для объекта Account.

@ JoinColum

можно использовать, если вы хотите переопределить имя внешнего ключа по умолчанию, например @JoinColum (name = "acc_id")

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...