带有复合主键的表在SpringBoot中的使用

32 篇文章 0 订阅
28 篇文章 0 订阅

在SpringBoot开发过程中,我们会遇到有些mysql表是带有复合主键的,此时我们进行开发的过程中需要注意以下方面.

1,首先在该表的实例类中的复合主键前面添加如下注解:

@EmbeddedId
比如下面的例子:我的表叫 app_network_configs 这个名字,对应的类是: AppNetwork,对应的复合主键是: AppNetworkKey(AppNetworkKey这个单独拎出来使之形成独立的一个类)

@EmbeddedId
private AppNetworkKey pk = new AppNetworkKey();
 
在复合主键的get方法中添加注解:@Transient ,如下的例子:
@Transient
public App getApp() {
    return getPk().getApp();
}

@Transient
public Network getNetwork() {
    return getPk().getNetwork();
}

2,在AppNetworkKey 中我们需要在类的头顶加上这样的注解:@Embeddable
然后后面的就按照正常的方式进行,特别注意,这个类中需要一个空的构造器和含有对应复合主键字段的构造器.
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "app_id")
private App app;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "network_id")
private Network network;

public AppNetworkKey() {
}

public AppNetworkKey(App app, Network network) {
    this.app = app;
    this.network = network;
}
3,使用的例子:
有了上面的表,我们可以做如下的操作:
public interface AppNetworkRepository extends JpaRepository<AppNetwork,AppNetworkKey> {
    @Query("select an from AppNetwork an where an.pk.app.id=:appId")
    List<AppNetwork> findByAppId(@Param("appId")String appId);

    @Query("select an from AppNetwork an where an.pk.network.id=:networkId")
    List<AppNetwork> findByNetworkId(@Param("networkId")String networkId);
}

附上上面的表对应的实体类
@Entity
@Table(name = "app_network_configs")
public class AppNetwork implements Serializable {
    private static final long serialVersionUID = -5779694190187550788L;
    @EmbeddedId
    private AppNetworkKey pk = new AppNetworkKey();
    private String config;
    @Column(name = "config_type")
    private String configType;
    private Double weight;
    @Column(name = "min_ecpm")
    private Double minEcpm;
    private Boolean available;
    @Column(name = "created_at")
    private Date createdAt;
    @Column(name = "modified_at")
    private Date modifiedAt;
    private Boolean synced;
    @Column(name = "synced_at")
    private Date syncedAt;


    public AppNetworkKey getPk() {
        return pk;
    }


    public void setPk(AppNetworkKey pk) {
        this.pk = pk;
    }


    @Transient
    public App getApp() {
        return getPk().getApp();
    }


    @Transient
    public Network getNetwork() {
        return getPk().getNetwork();
    }


    public String getConfig() {
        return config;
    }


    public void setConfig(String config) {
        this.config = config;
    }


    public String getConfigType() {
        return configType;
    }


    public void setConfigType(String configType) {
        this.configType = configType;
    }


    public Double getWeight() {
        return weight;
    }


    public void setWeight(Double weight) {
        this.weight = weight;
    }


    public Double getMinEcpm() {
        return minEcpm;
    }


    public void setMinEcpm(Double minEcpm) {
        this.minEcpm = minEcpm;
    }


    public Boolean getAvailable() {
        return available;
    }


    public void setAvailable(Boolean available) {
        this.available = available;
    }


    public Date getCreatedAt() {
        return createdAt;
    }


    public void setCreatedAt(Date createdAt) {
        this.createdAt = createdAt;
    }


    public Date getModifiedAt() {
        return modifiedAt;
    }


    public void setModifiedAt(Date modifiedAt) {
        this.modifiedAt = modifiedAt;
    }


    public Boolean getSynced() {
        return synced;
    }


    public void setSynced(Boolean synced) {
        this.synced = synced;
    }


    public Date getSyncedAt() {
        return syncedAt;
    }


    public void setSyncedAt(Date syncedAt) {
        this.syncedAt = syncedAt;
    }


}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值