9

私の目標は、一意のフィールドIMEIを持つエンティティDeviceを作成することです。これを主キーとして使用し、デバイス登録時に指定します(エンティティの作成時に手動で指定します)。私は開発にSpringrooツールを使用し、ORMとして休止状態にしています。

エンティティ宣言でこれを指定すると、次のようになります。

@RooJavaBean
@RooToString
@RooJpaActiveRecord(identifierField = "IMEI", identifierType = String.class)
public class Device {...}

私はこれを生成します:

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "IMEI")
private String Device.IMEI;

mysql dbを使用してプロジェクトをサーバーにデプロイしているときに、次のエラーが発生します。

2013-03-17 20:03:23,136 [main] ERROR org.hibernate.tool.hbm2ddl.SchemaExport - HHH000389: Unsuccessful: create table device (imei varchar(255) not null auto_increment, model varchar(255), name varchar(255) not null, version integer, primary key (imei))
2013-03-17 20:03:23,136 [main] ERROR org.hibernate.tool.hbm2ddl.SchemaExport - Incorrect column specifier for column 'imei'

次に、rooで生成されたフィールドをオーバーライドします

@Id
@GeneratedValue(generator = "org.hibernate.id.Assigned")
@Column(name = "the_code")
private String code;

(私はここでこれを見つけました)

しかし、それでもエラーが発生します。次に、コードを単純に次のように変更しました。

 @Id
private String IMEI;

次に、正常に動作し、エンティティを保存する前にimeiフィールドを指定するように求められます。

私の質問は次のとおりです。

カスタムフィールドをidとして使用するのは正しいですか?

文字列で大丈夫ですか?

Hibernateで生成されるのではなく、デバイスimeiから取得されても大丈夫ですか?

org.hibernate.id.Assignedとは何ですか?

@RooJpaActiveRecord(identifierField = "IMEI"、identifierType = String.class)のroo生成コードが機能しないのはなぜですか?

文字列の自動生成された主キーを作成することは可能ですか?

デフォルトのGeneratedValue戦略値(私の最後のケース)は何ですか?

公式ドキュメントを読みましたが、すべてを理解していませんでした。このすべてについて読むことができる記事を参照してください。

長い質問をありがとう、ごめんなさい。

4

3 に答える 3

21

簡単な解決策は@PrePersist、エンティティ クラスで注釈を使用することです。

メソッドを追加するだけ

@PrePersist
private void ensureId(){
    this.setId(UUID.randomUUID().toString());
}

@GeneratedValue注釈を取り除きます。

PrePersist ドキュメント: http://docs.oracle.com/javaee/5/api/javax/persistence/PrePersist.html

ステファノ

于 2013-03-18T15:53:02.457 に答える
16

@GeneratedValue(strategy = GenerationType.AUTO)Stringタイプでは使用できません。Stringそのため、ID として使用する場合は、手動で割り当てる必要があります。ただし、必要に応じて String を ID として使用しても問題ありません。

を使用org.hibernate.id.Assignedすると、データを保存する前に ID 値を割り当てる必要があることも意味します。

@GeneratedValue注釈が追加されていない場合、デフォルトでジェネレーターが割り当てられます。つまり、アプリケーションによって識別子の値を設定する必要があります。

詳細については、休止状態のマニュアルを参照してください。

于 2013-03-18T05:26:18.120 に答える