【发布时间】:2018-09-04 01:09:02
【问题描述】:
我正在学习 Spring Data 和 JPA,但无法在我的实体中建立简单的 ManyToOne - OneToMany 连接。
示例:汽车与人(车主)的模型关系,一个人可以拥有多辆汽车,但一辆车只属于一个人。
问题:Car 的所有者(使用 ManyToOne 注释)始终为空。
App.java
@EnableJpaRepositories
@SpringBootApplication
public class App {
@Autowired private PersonRepository personRepository;
@Autowired private CarRepository carRepository;
@EventListener
@Transactional
public void handleContextRefresh(ContextRefreshedEvent event) {
Car car1 = new Car();
Car car2 = new Car();
Person person = new Person();
car1.setName("Ferrari");
car2.setName("Porsche");
person.setName("Person Name");
carRepository.save(car1);
carRepository.save(car2);
person.getCars().add(car1);
person.getCars().add(car2);
personRepository.save(person);
carRepository.findAll().forEach(System.out::println); // TODO owner should not be null
personRepository.findAll().forEach(System.out::println);
}
public static void main(String[] args) throws IOException, URISyntaxException {
SpringApplication.run(App.class, args);
}
}
汽车.java
@Entity
public class Car {
@Id
@GeneratedValue
private UUID id;
private String name;
@ManyToOne
private Person owner;
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public Person getOwner() { return owner; }
public void setOwner(Person owner) { this.owner = owner; }
@Override
public String toString() {
return "Car [id=" + id + ", name=" + name + ", owner=" + owner + "]";
}
}
CarRepository.java
@Repository
public interface CarRepository extends CrudRepository<Car, UUID> { }
Person.java
@Entity
public class Person {
@Id
@GeneratedValue
private UUID id;
private String name;
@OneToMany(mappedBy="owner", cascade=CascadeType.ALL)
private Set<Car> cars = new HashSet<>();
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public Set<Car> getCars() { return cars; }
public void setCars(Set<Car> cars) { this.cars = cars; }
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", cars=" + cars + "]";
}
}
PersonRepository.java
@Repository
public interface PersonRepository extends CrudRepository<Person, UUID> { }
输出:
Car [id=10b38a23-536d-4b8f-8578-16e12f2f65d1, name=Ferrari, owner=null]
Car [id=2c15abf9-cb96-4d70-9271-b25096764276, name=Porsche, owner=null]
Person [id=8484b16f-1645-49af-a4d5-4b6ba7238aba, name=Person Name, cars=[Car [id=2c15abf9-cb96-4d70-9271-b25096764276, name=Porsche, owner=null], Car [id=10b38a23-536d-4b8f-8578-16e12f2f65d1, name=Ferrari, owner=null]]]
两辆车的车主都为空。我该如何解决这个问题?
【问题讨论】:
-
这都是在单个事务的上下文中,不同的存储库处理保存,并且没有刷新,所以我不确定您是否可以从 carRepo 检索 personRepo 所做的更改。简单的答案是只打电话给
car.setOwner并把人传进去。否则你需要使用flush,使用entityManager实例而不是两个单独的repos,使用personRepo来取回汽车,或重组你的代码以用不同的方法处理事情。
标签: spring jpa spring-data