Двунаправленный каскадный выпуск @OneToOne JPA / Hibernate / Spring-Data - PullRequest
0 голосов
/ 04 мая 2018

У меня есть сущности ниже:

@Entity
public class User implements Serializable {

   private String username;

   @OneToOne( optional = false, mappedBy = "user", orphanRemoval = true, fetch = FetchType.LAZY, cascade = CascadeType.ALL )
   private BankAccount bankAccount;
   //.....
}

И

@Entity
public class BankAccount implements Serializable {

    @OneToOne( optional = false, fetch = FetchType.LAZY )
    @JoinColumn( name = "user", unique = true, referencedColumnName = "username" )
    private User user;
    //...
}

Надеюсь, что я прав, сущность User является родителем, поэтому я могу каскадировать ее операции до BankAccount. Но когда я пытаюсь это:

User user = new User();
user.setBankAccount(new BanckAccount());
userRepository.save(user);

У меня есть исключение:

org.hibernate.PropertyValueException: not-null property references a null or transient value : org.company.models.User.bankAccount

Каскад сохранения не распространяется, и мне нужно сохранить bankAccount перед его настройкой для пользователя. Я что-то упустил, я должен проверить свою ассоциацию? Спасибо

Ответы [ 3 ]

0 голосов
/ 04 мая 2018

Ваш mappedBy должен быть дочерним объектом, который вы хотите сохранить первым. Таким образом, здесь отображается в BankAccount. Также Вы должны использовать @JoinColumn в родительской сущности, чтобы внешний ключ дочернего элемента можно было сохранить в родительской таблице. Например:

@Entity
public class User implements Serializable {

   private String username;

   @OneToOne( optional = false, orphanRemoval = true, fetch = FetchType.LAZY, cascade = CascadeType.ALL )
   @JoinColumn(name = "bank_account_id")
   private BankAccount bankAccount;
   //.....
}

А в BankAccount:

@Entity
public class BankAccount implements Serializable {

    @OneToOne( optional = false, fetch = FetchType.LAZY, mappedBy = "bankAccount")
    private User user;
    //...
}

См. Аналогичный пример здесь.

0 голосов
/ 26 мая 2018

Чтобы завершить этот пост, в этом случае работает каскадная операция от дочернего к родительскому @OneToOne(optional=false,mappedBy=...). Если мы установим optional=false на дочерней стороне, кажется, что работает каскадирование (по крайней мере Cascade.PERSIST).

0 голосов
/ 04 мая 2018

Вы указываете mappedBy на неправильной стороне отношения. Это должно быть указано на обратной (не владеющей) стороне. Поскольку вы хотите, чтобы пользователь сохранил учетную запись, он должен быть владельцем.

...