2017-05-08 55 views
1

我有以下关系如何建模包含外键的组合主键?

enter image description here

正如你看到的,细节的feature_affinities表具有复合键(feature_idzoom)的哪些部件是一个外键的,指的features主表。

我写

@Entity 
@Table(name = "features") 
@Inheritance(strategy = InheritanceType.JOINED) 
@DiscriminatorColumn(name = "subtype_id", discriminatorType = DiscriminatorType.INTEGER) 
public class Feature { 

    @Id 
    @Column(name="id") 
    @GeneratedValue(generator="sqlite") 
    @TableGenerator(name="sqlite", table="sqlite_sequence", 
     pkColumnName="name", valueColumnName="seq", 
     pkColumnValue="features") 
// @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Getter 
    @Setter 
    private long id; 

... 

@Embeddable 
public class FeatureAffinitiesKey implements Serializable { 

    @ManyToOne 
    @JoinColumn(name = "feature_id") 
    @Getter 
    @Setter 
    private Feature feature; 

    @Column(name = "zoom") 
    @Getter 
    @Setter 
    private Long zoom; 
} 

@Entity 
@Table(name = "feature_affinities") 
public class FeatureAffinities { 

    @Getter 
    @Setter 
    @EmbeddedId 
    private FeatureAffinitiesKey key; 

... 

这是正确的吗?

我很困惑,它声称我声明FeatureAffinitiesKey可序列化。但由于它包含Featurefiels,所以Feature也应该是可序列化的,也是Feature内的所有复合相关类。

这是正常的吗?

回答

1

这是JPA规范所称的“派生身份”。你应该定义你的FeatureAffinities类略有不同:

@Embeddable 
public class FeatureAffinitiesKey implements Serializable { 

    @Column(name = "feature_id") 
    @Getter 
    @Setter 
    private long featureId; // corresponds to the type of Feature's PK 

    @Column(name = "zoom") 
    @Getter 
    @Setter 
    private Long zoom; 
} 

@Entity 
@Table(name = "feature_affinities") 
public class FeatureAffinities { 

    @Getter 
    @Setter 
    @EmbeddedId 
    private FeatureAffinitiesKey key; 

    @MapsId("featureId") // maps 'featureId' attribute of embedded id 
    @ManyToOne 
    @Getter 
    @Setter 
    private Feature feature; 

    ... 
} 

注意@MapsId注释上FeatureAffinities.feature

导出的身份在2.4.1节的JPA 2.1规范中讨论。