4

JPA 2/Hibernate で複合主キーと外部キーを機能させるのに問題があります。国と州で簡単なシナリオを作成しようとしています:

国エンティティ:

@Entity
@Table(name = "country")
public class Country extends DomainObjectBase implements Serializable {

    @Id
    @Basic(optional = false)
    @Column(name = "code")
    private String code;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "country")
    private List<Province> provinces;
}

州の主キー:

@Embeddable
public class ProvincePK implements Serializable {

    @Basic(optional = false)
    @Column(name = "code")
    private String code;

    @Basic(optional = false)
    @Column(name = "country_code")
    private String countryCode;
}

州エンティティ:

@Entity
@Table(name = "province")
public class Province extends DomainObjectBase implements Serializable {

    @EmbeddedId
    protected ProvincePK provincePK;

    @MapsId("country_code")
    @JoinColumn(name = "country_code", referencedColumnName = "code", insertable = false, updatable = false)
    @ManyToOne(optional = false)
    private Country country;
}

これにより、1 つの例外を除いて正しいテーブルが作成されます。

国テーブル:

  1. コードPK
  2. ...

州表

  1. code PK FK -これは、国テーブルのコード列への外部キー参照の作成に問題がある場所です
  2. country_code FKこれは私が望む唯一の外部キー参照です
  3. ...

エンティティ/複合キーを hibernate にマップして、必要なスキーマを生成するにはどうすればよいですか? 現在、その国には州コードが含まれていると予想されるため、データを州に挿入できません!

助けてくれてありがとう。

4

2 に答える 2

2

これを試して。このようなデータモデルを扱うとき、それがうまくいくことがわかりました。

@Entity
@Table(name = "province")
@IdClass(ProvincePK.class)
public class Province extends DomainObjectBase implements Serializable {
        
    @Id
    @Basic(optional = false)
    @Column(name = "code")
    private String code;
    
    @Id
    @Basic(optional = false, insertable = false, updatable = false)
    @Column(name = "country_code")
    private String countryCode;
            
    @JoinColumn(name = "country_code", referencedColumnName = "code")
    @ManyToOne
    private Country country;
}
于 2011-01-29T02:38:14.887 に答える
1

@MapsIDProvincePK引数は、クラス内の属性の名前と一致する必要があります。@JoinColumnマークする必要がありますinsertable=true,updatable=true。ここにコードがあります -

@Entity
@Table(name = "province")
public class Province  implements Serializable {

    @EmbeddedId
    protected ProvincePK provincePK;

    @MapsId(value = "country_code")
    @JoinColumn(name = "country_code", referencedColumnName = "code")
    @ManyToOne(optional = false)
    private Country country;
}

@Embeddable
public class ProvincePK implements Serializable {

    @Basic(optional = false)
    @Column(name = "code")
    private String code;

    @Basic(optional = false)
    @Column(name = "country_code")
    private String country_code;
}

@Entity
@Table(name = "country")
public class Country  implements Serializable {

    @Id
    @Basic(optional = false)
    @Column(name = "code")
    private String code;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "country")
    private List<Province> provinces;
}

それが役に立てば幸い。

于 2017-07-07T20:39:33.800 に答える