比方說,我有以下的商業模式:如何聲明使用Spring的JPA @OneToMany和@ManyToOne註釋數據庫映射和Hibernate
,用戶可以在N類車輛。
這是我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); (見在底部的摘錄從系統信息庫類)
現在,因爲我的解決方案有幾個問題不能按預期工作:
的是,即使可能只保存用戶對象並讓用戶對象內的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);
}
你能解釋一下你的意思嗎?沒有超過1個EAGER關係*?我的用戶類實際上有4 *集*,因此有4個與獲取類型** EAGER **的OneToMany關係。我不會收到錯誤。 – 2013-02-26 16:13:09
請參閱:http://www.jroller.com/eyallupu/entry/hibernate_exception_simultaneously_fetch_multiple這是在Hibernate中頗爲流行的錯誤,所以最常見的解決方法是避免EAGER取。順便說一句,這是相當有趣的,爲什麼它的工作適合你,因爲在我的當前項目類中的2個EAGER實體不工作(拋出'MultipleBagFetchException:不能同時獲取多種bags') – n1ckolas 2013-02-26 16:29:39
這是工作,但現在沒有EAGER我不得不使用懶惰,並會遇到*無會話*錯誤。感謝您的幫助,並指出EAGER問題。我創建了一個[新問題](http://stackoverflow.com/questions/15094109/easiest-way-to-add-vehicle-to-user-with-jpa-hibernate-using-spring)關於可能省略setOwner ()在OneToMany關係的* Many *部分(它有效地設置了用戶,只是將其稱爲擁有者)。 – 2013-02-26 16:35:29