Как сохранить вложенные объекты в Hibernate? - PullRequest
0 голосов
/ 18 октября 2018

У меня есть два класса, Customer и ShoppingCart.Java-структура двух классов выглядит следующим образом:

Класс клиента:

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class Customer extends User implements Serializable {

    @OneToOne(mappedBy = "owner", cascade=CascadeType.ALL)
    private ShoppingCart shoppingCart;

    @OneToMany(mappedBy = "customer", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    private List<Purchase> purchases;

    public Customer() {
        super();
    }

    public Customer(String username, String email, String password) {
        super(username, email, password);
        this.shoppingCart = new ShoppingCart();
        this.purchases = new ArrayList<>();
    }

    getters and setters

}

Класс ShoppingCart:

@Entity
public class ShoppingCart implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer shoppingCartId;

    @OneToOne
    @JoinColumn(name = "owner_id")
    private Customer owner;

    @OneToMany(mappedBy = "shoppingCart")
    private List<CartItem> items;

    public ShoppingCart(Customer owner) {
        this.owner = owner;
        this.items = new ArrayList<>();
    }

    public ShoppingCart() {
        this.items = new ArrayList<>();
    }

    getters and setters
}

При необходимости это класс User:

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class User implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private Integer userId;
    private String username;
    private String email;
    private String password;

    public User() {
    }

    public User(String username, String email, String password) {
        this.username = username;
        this.email = email;
        this.password = password;
    }

    getters and setters
}

Я настроил классы репозиториев следующим образом:

@Repository
public interface CustomerRepository extends CrudRepository<Customer, Integer> {
}

@Repository
public interface UserRepository extends CrudRepository<User, Integer> {
}

@Repository
public interface ShoppingCartRepository extends CrudRepository<ShoppingCart, Integer> {
}

То, что я хочу, - это просто, когда я создаю Customer, я также хочу создать кортеж ShoppingCart внутрибаза данных.И это на самом деле работает нормально, единственная проблема заключается в том, что внешний ключ ShoppingCart, связанный с Клиентом, имеет значение null.У меня просто атрибут shopping_cart_id установлен в целочисленное значение (правильно).

Код, который я использовал для проверки, следующий:

Customer customer = new Customer("stefanosambruna", "ste23s@hotmail.it", "*******");
customerRepository.save(customer);

Возможно, я поместил некоторые аннотации в неправильных местах, но я действительно не знаю, какие именно.Это связано с конструкторами?Или в конфигурации @JoinColumn и mappedBy?Я прочитал все вопросы и ответы по этой теме здесь, в StackOverflow и в некоторых других источниках, но я не нашел ничего 100% полезного.Надеюсь, что дал все необходимые детали.

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