多対多の関係には、Person と Vehicle の 2 つのクラスがあります。新しい人物が作成された場合、または既存の人物のレコードが更新された場合 (例: Vehicle レコードが追加された場合)、既存の Vehicle レコードが存在する場合はそれを使用することが望ましいでしょう。
問題は、それをどのように達成するかです。更新または挿入できるスレッドが多数あるため、挿入または更新の前にクエリを実行することはできません。
この時点で、アプリケーションは一意の制約例外をチェックし、キャッチされると、新しい既存の Vehicle オブジェクトが、「登録」列によってデータベースからクエリされたオブジェクトに置き換えられます。このソリューションは機能していますが、Vehicle レコードごとに個別のセッションを作成する必要があるため、少し扱いにくいようです。
休止状態の注釈によって目的の動作を実現する方法はありますか? または完全に異なるソリューションですか?ありがとう。
@Entity
@Table(name="PERSON", uniqueConstraints = { @UniqueConstraint(columnNames = "name", name="NAME_KEY") })
public class Person implements Serializable {
private static final long serialVersionUID = 3507716047052335731L;
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="PersonIdSeq")
@SequenceGenerator( name = "PersonIdSeq", sequenceName="PERSON_ID_SEQ")
private Long id;
@Index(name="PERSON_NAME_IDX")
private String name;
@ManyToMany(targetEntity=Vehicle.class, cascade={CascadeType.PERSIST, CascadeType.MERGE})
@JoinTable(name="PERSON_VEHICLE_LNK", joinColumns=@JoinColumn(name="PERSON_ID"),inverseJoinColumns=@JoinColumn(name="VEHICLE_ID"),
uniqueConstraints = { @UniqueConstraint(columnNames = {"PERSON_ID", "VEHICLE_ID"}, name="person_vehicle_lnk_key")})
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="PersonVehicleLnkIdSeq")
@SequenceGenerator(name = "PersonVehicleLnkIdSeq", sequenceName="PERSON_VEHICLE_LNK_ID_SEQ")
@CollectionId(columns = @Column(name="ID"), type=@Type(type="long"), generator = "PersonVehicleLnkIdSeq")
private List<Vehicle> vehicle = new ArrayList<>();
...
@Entity
@Table( name = "VEHICLE", uniqueConstraints = {@UniqueConstraint(columnNames="registration", name="REGISTRATION_KEY")} )
public class Vehicle implements Serializable {
private static final long serialVersionUID = -5592281235230216382L;
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="VehicleIdSeq")
@SequenceGenerator( name = "VehicleIdSeq", sequenceName="VEHICLE_ID_SEQ")
private Long id;
@Index(name="REGISTRATION_IDX")
private String registration;
...