【问题标题】:JPA Cascade PersistenceJPA 级联持久性
【发布时间】:2018-05-15 10:49:14
【问题描述】:

我想将Persons 和他们的Cars 存储在数据库中。我用的是 Spring 5。

问题是,当我想在数据库中添加一个有汽车的人时,'car' 表中的 'person_id' 字段设置为 null,而不是在创建的人的 id 上设置。 这很奇怪,因为我什至在 Car 类中设置了 nullable=false

@Entity
public class Person {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Integer id;

    @OneToMany(mappedBy = "person",cascade = CascadeType.ALL)
    List<Car> cars;

}

@Entity
public class Car {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Integer carId;

    @ManyToOne
    @JoinColumn(name = "person_id",nullable=false)
    private Person person;
}



CREATE TABLE person (
    id INT PRIMARY KEY AUTO_INCREMENT,
    ...
);

CREATE TABLE car (
    id INT PRIMARY KEY AUTO_INCREMENT,
    person_id INT,
    ADD CONSTRAINT person_id REFERENCES person(id)
);

我用JpaRepository来救人:

Person p = new Person();
List<Car> cars = new ArrayList<>();
Car c1 = new Car();
Car c2 = new Car();

cars.add(c1);
cars.add(c2);
p.setCars(cars);
personJpaRepository.save(p); 

【问题讨论】:

  • 你还没有把车加到人身上
  • 建议保持映射和数据库同步:在 person_id 上添加非空

标签: java spring hibernate jpa persistence


【解决方案1】:

如果您想利用 Cascade 选项,您必须记住在关系的两侧设置依赖关系。 否则持久化提供者不会认为这是一种关系:

cars.add(c1);
cars.add(c2);

c1.setPerson(p);
c2.setPerson(p);

p.setCars(cars);
personJpaRepository.save(p); 

【讨论】:

    猜你喜欢
    • 2018-01-02
    • 2013-10-26
    • 2012-07-13
    • 2011-03-12
    • 1970-01-01
    • 1970-01-01
    • 2015-11-02
    • 2013-08-24
    • 2011-11-23
    相关资源
    最近更新 更多