2

これが私のコードです。親クラスに基づいて自動 ID を生成したいと思います。Airport を作成するメソッドを使用しているため、それに付随する ID は null 値です。AirportModelでIDが生成されるのですが、子クラスでの作り方がわかりません。

@Entity(name = "Airport")
@Table(name = "ai_airport")
public class AirportModel {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", nullable = false)
private Long id;
    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
    @JoinColumn(name = "airport_id")
    private List<AirportTranslatedModel> translations;

セカンドクラス(子供):

    @Entity(name = "AirportTranslated")
    @IdClass(AirportTranslatedModelKey.class)
    @Table(name = "ai_translated_airport")
    public class AirportTranslatedModel 
        @Id
        @Column(name="airport_id")
        private Long airportId;

        @Id
        @Column(name="language_code", length=2)
        private String languageCode;

3 つ目 (キー):

@Embeddable
public class AirportTranslatedModelKey implements Serializable {

    @Column(name="airport_id")
    private Long airportId;

    @Column(name="language_code", length=2)
    private String languageCode;

それでも同じエラーが発生します。ログ:

Hibernate: insert into ai_airport (active, airport_code, city_code, country_code, externa
l_id, is_default, latitude, longitude, market_code, min_connection_time_DD, min_connection_time_DI, min_connection_time_id, min_connection_time_II, time_diff, VERSION) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)

Hibernate: insert into ai_translated_airport (airport_long_name, airport_short_name, airp
ort_id, language_code) values (?, ?, ?, ?)
ERROR org.hibernate.engine.jdbc.spi.SqlExceptionHelper - Column 'airport_id' cannot be null
4

1 に答える 1

2

現在の設定では、AirportTranslatedModel の airport_id フィールドが Long でマッピングされています。この場合、airportId を手動で設定して、データベースに ID を設定する必要があります。これには、AirportModel->AirportTranslatedModel 関連付けを作成する前に、AirportModel を永続化し、場合によってはフラッシュしてその PK を割り当てて使用できるようにする必要があります。これにより、AirportTranslatedModel.airportId を設定できます。

ただし、JPA 2 では派生 ID が許可されます。AirportTranslatedModel に AirportModel から割り当てられた ID を持たせたい場合は、AirportModel との関係が必要です。http://wiki.eclipse.org/EclipseLink/Examples/JPA/2.0/DerivedIdentifiersに簡単な例があります

同様の方法でクラスをモデル化するとしたら、次のようになります。

public class AirportModel {
  ..
  @OneToMany(mappedby="airportModel", cascade = CascadeType.ALL, orphanRemoval = true)
  private List<AirportTranslatedModel> translations;
  ..
}

public class AirportTranslatedModel {
  @Id
  @JoinColumn(name="airport_id")
  private AirportModel airportModel;

  @Id
  @Column(name="language_code", length=2)
  private String languageCode;
  ..
}
public class AirportTranslatedModelKey implements Serializable {
    private Long airportModel;

    private String languageCode;
}

pk クラスとして使用するだけの場合は、AirportTranslatedModelKey を組み込み可能にする必要がないことに注意してください。また、AirportTranslatedModelKey には Long airportModel が含まれていることに注意してください。これは、AirportModel の pk のタイプ、および AirportTranslatedModel の関係プロパティの名前と一致する必要があります。

これにより、AirportTranslatedModel は AirportModel から airport_id 値を取得し、両方のエンティティがまだ新しいときにまだ生成されていない可能性がある場合でも、それを PK として使用できます。

于 2013-06-14T18:39:30.737 に答える