2017-05-08 3 views
1

Ich habe die folgende BeziehungWie modelliert man einen zusammengesetzten Primärschlüssel, der einen Fremdschlüssel enthält?

enter image description here

Wie Sie sehen, Details Tabelle feature_affinities hat zusammengesetzte Schlüssel (feature_id, zoom), der von welchen Komponenten es ein Fremdschlüssel mit Bezug Master-Tabelle von features.

Ich schrieb

@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; 

... 

Ist das richtig?

Ich bin verwirrt, dass es behauptet, dass ich FeatureAffinitiesKey Serialisierbar erklären. Aber da es Feature Felder enthält, wird es dazu führen, Feature sollte auch serialisieren und auch alle zusammenhängenden Klassen innerhalb Feature sein.

Ist das normal?

Antwort

1

Dies ist, was die JPA-Spezifikation eine "abgeleitete Identität" nennt.

@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; 

    ... 
} 

Notiere die @MapsId Anmerkung auf FeatureAffinities.feature: Sie sollten Ihre FeatureAffinities Klassen etwas anders definieren.

Abgeleitete Identitäten werden in der JPA 2.1 Spezifikation in Abschnitt 2.4.1 diskutiert.

Verwandte Themen