0

私が次のビジネスモデルを持っていたとしましょう:

ユーザーは最大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);を呼び出すサービスレイヤーメソッドです。(リポジトリクラスからの抜粋については、下部を参照してください)


私のソリューションが期待どおりに機能していないため、いくつか質問があります。

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.PERSISTpersistsvehicles状況のみが存在する場合に設定されます。

の使用をお勧めしますCascadeType.ALL。したがってvehicles、ユーザーを削除すると削除され、ユーザーを更新/永続化すると車両も更新/永続化されます。

vehicleからuserにアクセスする場合はvehicle.setOwner(user)が必要です。

于 2013-02-24T21:57:54.267 に答える
0

エンティティのオブジェクトにの参照を必ず設定する必要がありUserます。そうしないと、Hibernate は関係を認識しません。Vehicle

また、一緒に使用することをお勧め@OneToManyします

  • cascade=CascadeType.ALLVehicle適切なカスケード操作のために(通常、まったく個別に触れないことに注意してくださいUser
  • fetch = FetchType.EAGER避けるためにLazyInitializationException(JPA 構成で複数の EAGER 関係を持つことはできないことに注意してください)
  • orphanRemoval = trueユーザーの更新後に「不要な」車両をクリーンアップするため
于 2013-02-25T14:14:25.297 に答える