5

Userクラスがあります:

@Entity
public class User extends Model {

@Id
public Long id;
public String email;
public String name;
public String password;
}

とドライバークラス

@Entity
public class Driver extends Model {
@Id
public Long id;

@OneToOne (cascade = CascadeType.ALL)
@Column(unique = true)
public User user;
}

user_idがDriversテーブル内で一意であることを確認したいと思います。しかし、上記のコードはそれを強制しません。(同じユーザーIDで複数のドライバーを作成できます)。

理想的には、ユーザークラスに@OneToOneリレーションを追加したくありません。これは、アプリ内にいくつかの異なる役割(ドライバー、教師、エージェントなど)があり、これらすべてのリレーションでユーザークラスを汚染したくないためです。

どうすればこれを達成できますか?

4

1 に答える 1

4

モデルでこのコードを試しましたが、機能しました。注意すべき点の1つは、@OneToOne注釈を使用して、他のモデルへの外部キー参照があることをORMに知らせる必要があることです。

モデルは次のようになります。

@Entity
// add unique constraint to user_id column
@Table(name = "driver", 
       uniqueConstraints = @UniqueConstraint(columnNames = "user_id")
)
public class Driver extends Model {
   @Id
   public Long id;

   @OneToOne
   @JoinColumn(name = "user_id")
   public User user;
}

次のような進化スクリプトが生成されます。

create table driver (
   id            bigint not null,
   user_id       bigint,

   constraint uq_driver_1 unique (user_id), # unique database constraint
   constraint pk_driver primary key (id)
);

userしたがって、このメソッドを使用すると、テーブル上に一意の参照があることを確認できdriverます。


追加情報

フレームワークではなく、モデルに適用されたデータベース(制約など )によって処理される追加の制約があるため、入力を検証したり、発生した例外を処理したりするために、サラウンドまたは式(モデルの保存)を実行できます。 PersistenceExceptionを処理するためのブロック付き。unique Model.save()form.get().save()try-catch

于 2013-04-24T04:27:12.570 に答える