0

假设我有以下商业模式:

用户最多拥有 n 个 Vehicles

这是我的DAO /用户类:

@Entity
@Table(name="USER")
public @Data class User extends AbstractPersistable<Long> {
    @OneToMany(cascade=CascadeType.PERSIST, mappedBy="owner")
    private Set<Vehicle> vehicles = new HashSet<Vehicle>();
}

这是车辆类:

@Entity
@Table(name="VEHICLE")
public @Data class Vehicle extends AbstractPersistable<Long> {
    @ManyToOne(optional = false)
    @JoinColumn(name = "user_id")
    User owner;
}

我希望能够像这样为新用户保存新车辆:

User user = new User();
user.setName("Fred"); // other setters omitted

Vehicle vehicle = new Vehicle();
vehicle.setEngine("..."); // other setters omitted 

user.getVehicles().add(vehicle);
userService.saveUser(user);

userService.saveUser()是一个服务层方法,被注释为@Transactional并调用 userRepository.save(user); (参见底部的 Repository 类的摘录)


现在有几个问题,因为我的解决方案没有按预期工作:

1.是否可以只保存用户对象并让用户对象内的 Vehicle-Set 自动持久化?
2.这是最佳实践吗?我知道用户是拥有实体。我希望在删除用户时删除用户的所有车辆。
3.或者我是否总是需要做一些类似vehicle.setOwner(user);的事情??
4.从您的角度来看,对此的最佳解决方案是什么?

我阅读了很多关于拥有实体和 JoinColumn/mappedBy 的内容。然而现在我比以前更困惑了。


此外,这是我的 UserRepository 的摘录:

import org.springframework.data.jpa.repository.JpaRepository;
import org.myproject.domains.User;

public interface UserRepository extends JpaRepository<User, Long> { 
User findByLoginName(String loginName); 
}
4

2 回答 2

0

CascadeType.PERSISTvehicles如果只有持续情况,则持续设置。

我建议你使用CascadeType.ALL. 因此vehicles,当您删除用户时将被删除,并且如果您更新/保留用户,车辆将被更新/保留。

如果您想从车辆访问用户,则vehicle.setOwner(user)是必需的。

于 2013-02-24T21:57:54.267 回答
0

您当然需要UserVehicle实体对象中设置引用,否则 Hibernate 将无法识别该关系。

我也建议使用@OneToManywith

  • cascade=CascadeType.ALL用于正确的级联操作(请注意,通常您根本不会Vehicle单独触摸User
  • fetch = FetchType.EAGER避免LazyInitializationException(请注意,您的 JPA 配置中不能有超过 1 个 EAGER 关系)
  • orphanRemoval = true用于在用户更新后清理“不必要的”车辆
于 2013-02-25T14:14:25.297 回答