2017-05-08 2 views
1

J'ai la relation suivanteComment modéliser une clé primaire composite, contenant une clé étrangère?

enter image description here

Comme vous le voyez, les détails table des feature_affinities a clé composite (feature_id, zoom), de quels composants une clé étrangère, se référant table maître de features.

j'ai écrit

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

... 

Est-ce exact?

Je suis confus, qu'il m'a réclamé de déclarer FeatureAffinitiesKey sérialisable. Mais puisqu'il contient Feature flèches, il provoquera Feature devrait être sérialisable aussi et aussi toutes les classes connexes composés à l'intérieur de Feature aussi.

Est-ce normal?

Répondre

1

C'est ce que la spécification JPA appelle une "identité dérivée". Vous devez définir vos classes un peu différemment 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; 

    ... 
} 

Notez l'annotation @MapsId sur FeatureAffinities.feature.

Les identités dérivées sont traitées dans la spécification JPA 2.1 de la section 2.4.1.