1

ゼロ対 1 の 2 つのエンティティ間の関係を確立しようとしています。つまり、親は関連付けられた子エンティティなしで保存でき、関連付けられた子とともに保存することもできます。以下は2つのエンティティクラスです...


従業員(親)

public class Employee {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(name="EMP_NAME")
    private String name;

    @PrimaryKeyJoinColumn
    @OneToOne(cascade = {CascadeType.ALL})
    private EmployeeInfo info;

    @Column(name="EMP_ENUM")
    private Integer enumId;

EmployeeInfo (子)

public class EmployeeInfo {
        @Id
        @GeneratedValue(strategy=GenerationType.AUTO)
        private Long id;

        @Column(name="EMPLOYEE_EMAIL")
        private String email;

MySql DB で AUTO INCREMENT に設定された唯一の親 (従業員) テーブルのこのような関係と id 列では、問題は、親->子オブジェクト グラフの保存中に、次の例外が発生することです。

org.springframework.orm.hibernate3.HibernateJdbcException: JDBC exception on Hibernate data access: SQLException for SQL [insert into EMP_INFO 
Caused by: java.sql.SQLException: Field 'id' doesn't have a default value

DB で Child Table の Id プロパティを AUTO INCREMENT に設定してみましたが、このような Parent->Child オブジェクト グラフの永続化は成功しています。ただし、関連する EmpInfo オブジェクトなしで親 (Employee) オブジェクトを保存したいシナリオがあるため、ここで説明されている問題が表面化しており、したがって、子の id 列に AUTO INCREMENT を設定したくありません


1 つの解決策は、PrimaryKeyJoinColumn を使用せずに特定の JoinColumn を使用することですが、それによって既存のテーブルに不要な列が追加されます。


誰もそのような問題に遭遇しましたか?はいの場合、ポインタは非常に役立ちます。

4

2 に答える 2

1

関連付けられたEmpInfoオブジェクトなしで親(Employee)オブジェクトを保存したいシナリオがあります。

aのoptional属性はOneToOneデフォルトtrueであり、これが必要なものです。

ただし、ここではどういうわけか誤用してい@PrimaryKeyJoinColumnます(実際には、実際に何を達成したいかによって異なりますが、現在の注釈の組み合わせは正しくありません)。

共有OneToOne 主キーを使用してマップする場合は、を使用し@PrimaryKeyJoinColumnます。ただし、その場合は、GeneratedValueonEmployeeInfoを使用してIDを手動で設定しないでください。手動で設定したくない場合は、前の質問ですでに説明したHibernate固有の foreignジェネレーターを使用してください。下記の関連する質問も確認してください。

また、共有主キーを使用したくない場合(データベースによって生成されたIDを取得しようとしているため、現在のコードのように)、を使用しないPrimaryKeyJoinColumnでください。

あなたは選択をしなければなりません。

参考文献

  • JPA 1.0仕様:
    • 9.1.32PrimaryKeyJoinColumn注釈

関連する質問

于 2010-08-17T17:17:47.343 に答える
1

最後に、パスカルと私の側からのグーグルのおかげで、それが機能するようになりました。どうやら、親が子なしで存在できるような関係には、ネイティブキージェネレーターを使用できません (オプション = true)。最終的に機能したのは次のとおりで、Hibernate 固有の注釈 (@GenericGenerator) を処理する必要があり、必要な単方向ではなく双方向の関係を処理する必要があるという欠点が残りました。

Employee (Parent) class remains unchanged as above. It has AUTO INCREMENT on the Id column.

子クラス (EmployeeInfo) に関しては、次のように変更されましたが、ここでも Id 列に AUTO INCREMENT が設定されていません。

@Table(name="EMP_INFO")
@Entity
public class EmployeeInfo {
    @Id
    @GeneratedValue(generator="foreign")
    @GenericGenerator(name="foreign", strategy = "foreign", parameters={
    @Parameter(name="property", value="verifInfo")}) 
    private Long id;

    @OneToOne(optional=false)
    @JoinColumn (name="id")
    private Employee emp;

    @Column(name="EMPLOYEE_EMAIL")
    private String email;

これは私が望んでいたことを達成するのに役立ちましたが、マイナス面として、GenericGenerator は JPA アノテーションではなく、休止状態のアノテーションです。悲しいことに、JPA は現在この(または同様の)アノテーションをサポートしていないため、現時点ではそれを処理する必要があります。 .

とにかく、そのようなケースを乗り越えるのに役立ちます:-)

于 2010-08-18T06:43:01.293 に答える