【问题标题】:JPA Composite Key WITH Sequence in spring boot JPA春季启动JPA中的JPA复合键与序列
【发布时间】:2020-11-24 16:51:35
【问题描述】:

在普通的 JPA 或 Hibernate 中是否可以使用复合键,其中复合键的一个元素是一个序列,而另一个元素是用外键映射的。

我的表中有一个复合键,其中一部分需要由序列生成。 我尝试了以下方法,但它不起作用

类产品


@Entity
public class Produit{
    @EmbeddedId
    private ProduitClientPK id=new ProduitClientPK();
    private Client client;

    public ProduitClientPK getId() {
        return id;
    }

    public void setId(ProduitClientPK id) {
        this.id = id;
    }

  

    @JsonIgnore
    @ManyToOne
    @JoinColumn(name="FK_CLIENT")
    public Client getClient() {
        return client;
    }

    public void setClient(Client client) {
        this.client = client;
    }


}

类复合键:



@Embeddable
public class ProduitClientPK implements Serializable {
    private long fkproduit;
    private long clientSeq;

    @Column(name = "FK_PRODUIT")
    @Id
    public long getFkProduit() {
        return fkproduit;
    }

    public void setFkProduit(long fkproduit) {
        this.fkproduit= fkproduit;
    }

    @Column(name = "CLIENT_SEQ")
    @Id
    public long getclientSeq() {
        return clientSeq;
    }

    public void setClientSeq(long clientSeq) {
        this.clientSeq= clientSeq;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        PolPolAvnEntityPK that = (PolPolAvnEntityPK) o;
        return fkPolice == that.fkPolice &&
                avnSeq == that.avnSeq;
    }

    @Override
    public int hashCode() {
        return Objects.hash(fkPolice, avnSeq);
    }
}

类客户端:

@Entity

public class Client {
    private Long id;
    private Set<Produit> produits;

    @Id
    @Column(name = "ID_PRODUIT")

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }


    @OneToMany(mappedBy = "client", cascade = CascadeType.ALL, orphanRemoval = true)
    public Set<Produit> getProduits() {
        return produits;
    }

    public void setProduits(Set<Produit> avenants) {
        this.produits = produits;
    }


    public void addProduits(Produit  produit){
        produit.setClient(this);
        produits.add(produit);
    }

}

【问题讨论】:

  • 你能在你的ProduitClientPK中添加@Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id;
  • 搞定了,还是不行
  • 我在你的例子中没有看到

标签: java spring-boot hibernate jpa composite-primary-key


【解决方案1】:

除非我误解了,否则您的模型没有多大意义。为什么需要FK_PRODUIT 成为主键的一部分?如果您使用CLIENT_SEQ 的序列,这足以使该行唯一。除此之外,不应该在持久化Client 时生成这个CLIENT_SEQ 值吗? IMO,您应该使用以下内容:

@Entity
public class Produit{
    @Id
    @GeneratedValue
    private Long id;
    private Client client;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    @JsonIgnore
    @ManyToOne
    @JoinColumn(name="FK_CLIENT")
    public Client getClient() {
        return client;
    }

    public void setClient(Client client) {
        this.client = client;
    }

}

【讨论】:

    【解决方案2】:

    不久前我遇到了同样的问题。如果您希望数据库生成其中一个 PK 字段,最好不要在您的情况下使用 @EmbeddedId。我不是 Hibernate 方面的专家,但据我所知,Hibernate 不会尝试将值设置为 ID 字段,除非它们由 @GeneratedValue 注释。只有这个注解可以告诉 Hibernate 依赖数据库序列。而且你不能在 Embeddable 类中做到这一点。

    如果您想生成一个@Id 字段,请尝试只使用一个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-25
      • 2020-05-17
      • 1970-01-01
      • 2020-08-19
      • 2018-03-22
      • 1970-01-01
      • 2016-01-30
      • 2017-06-25
      相关资源
      最近更新 更多