【问题标题】:How to model composite primary key, containing foreign key?如何建模包含外键的复合主键?
【发布时间】:2017-10-06 11:30:12
【问题描述】:

我有以下关系

如您所见,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 可序列化。但是由于它包含Feature 字段,这将导致Feature 也应该是可序列化的,而且Feature 中的所有复合相关类也应该是可序列化的。

这正常吗?

【问题讨论】:

    标签: java sqlite jpa serializable composite-key


    【解决方案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;
    
       ...
    }
    

    注意FeatureAffinities.feature 上的@MapsId 注释。

    派生的身份在 JPA 2.1 规范的第 2.4.1 节中进行了讨论。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-31
      相关资源
      最近更新 更多