2014-04-03 2 views
0

Я определил эту связь в моем User классе:Hibernate возвращение нуля для @OneToOne

@OneToOne (cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
    @JoinColumn (name = "id") 
    private Balance balance; 

Hibernate создает необходимые таблицы с правильными отношениями.

Однако, когда я возвращаю User объектов, используя следующий код, Balance установлен null.

User fetchedUser = userRepository.findOne(id);   
Balance balance = fetchedUser.getBalance(); 

Почему это?

(я использую Spring Data для доступа к данным.)

Edit:

Этот код генерирует users таблицу:

CREATE TABLE `users` (
    `id` BIGINT(20) NOT NULL AUTO_INCREMENT, 
    `contact_number` VARCHAR(255) NOT NULL, 
    `date_created` DATE NOT NULL, 
    `date_of_birth` DATE NOT NULL, 
    `device_id` VARCHAR(255) NOT NULL, 
    `email` VARCHAR(255) NULL DEFAULT NULL, 
    `gender` TINYINT(1) NOT NULL, 
    `location` VARCHAR(255) NOT NULL, 
    `name` VARCHAR(255) NOT NULL, 
    `password` VARCHAR(255) NOT NULL, 
    `username` VARCHAR(255) NOT NULL, 
    `balance_id` BIGINT(20) NULL DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    INDEX `FK6A68E08CBE6702` (`balance_id`), 
    CONSTRAINT `FK6A68E08CBE6702` FOREIGN KEY (`balance_id`) REFERENCES `balances` (`id`) 
) 

И это порождает balances

CREATE TABLE `balances` (
    `id` BIGINT(20) NOT NULL AUTO_INCREMENT, 
    `total_claimed` INT(11) NOT NULL, 
    `total_won` INT(11) NOT NULL, 
    PRIMARY KEY (`id`) 
) 
+1

Не могли бы вы предоставить более подробную информацию о вашей реализации? Особенно, как сопоставляется класс «Баланс» и как выглядит сгенерированная схема базы данных. – Blekit

+0

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

ответ

1

В @JoinColumn ссылки на названия аннотаций t колонку, в которой хранится внешний ключ для другой части отношений. Я могу только предположить, что в вашем столбце сопоставления id хранит идентификатор (PrimaryKey) User. Может быть, это должно быть что-то вроде:

@OneToOne(cascade = CascadeType.ALL) 
@JoinColum(name = "balance_id" referencedColumnName = "id") 
private Balance balance; 

Над отображения будет работать при выполнении следующих требований:

  • столбец USERS таблицы, указывающим на связанную запись в BALANCES таблицы называется balance_id
  • PrimaryKey колонка BALANCES стол называется id

Если имена, используемые в вашем приложении, отличаются друг от друга, вам необходимо соответствующим образом настроить это сопоставление.

Кроме того, возможно, вы хотите, чтобы отношения были двунаправленными. В этом случае следует добавить следующее отображение в Balance объекта:

@OneToOne(mappedBy = "balance") 
private User user; 
+0

Спасибо за ваш ответ Blekit. Имена соответствуют, и я обновил свой код, как вам было предложено, но поле баланса по-прежнему «null». –

+0

Глядя на сгенерированный DDL, кажется, что между таблицами 'USERS' и' BALANCES' нет никакой связи между собой (определение FK в определениях таблиц). Я думаю, вам следует восстановить схему после фиксации сопоставлений, как описано ниже, и повторить попытку. – Blekit

+0

Я не хочу, чтобы он был двунаправленным, потому что нет никакой необходимости, но если двунаправленное решение моей проблемы, я сделаю это. –

0

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

CREATE TABLE `balances` (
    `balance_id` BIGINT(20) NOT NULL AUTO_INCREMENT, 
    `total_claimed` INT(11) NOT NULL, 
    `total_won` INT(11) NOT NULL, 
    `user_id` BIGINT(20), 
    PRIMARY KEY (`id`) 
) 

alter table balances add constraint XFK_USER foreign key (user_id) 
    references users (id); 
+0

Одна из проблем, которую мы имеем, - это создать таблицы с использованием кода. Нам нужно разрешение на изменение таблиц базы данных. –

Смежные вопросы