boot-jpa中带序列的java-jpa复合键

s6fujrry  于 2021-07-06  发布在  Java
关注(0)|答案(2)|浏览(339)

在普通jpa或hibernate中是否可以使用复合键,其中复合键的一个元素是序列,另一个元素是用外键Map的。
我的表中有一个复合键,它的一部分需要由序列生成。我试过以下方法,但不起作用
类产品

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

}
yi0zb3m4

yi0zb3m41#

不久前我也遇到过同样的问题。如果希望数据库生成一个pk字段,最好不要在本例中使用@embeddedid。我不是hibernate方面的Maven,但是我知道hibernate不会试图仅在id字段由@generatedvalue注解时才将值设置为id字段。只有这个注解可以告诉hibernate依赖于数据库序列。在可嵌入类中不能这样做。
如果希望生成一个@id字段,请尝试只使用一个@id字段。

zi8p0yeb

zi8p0yeb2#

你的模式没有多大意义,除非我误解了。你为什么需要 FK_PRODUIT 成为主键的一部分?如果您使用的是 CLIENT_SEQ ,这足以使行成为唯一的。除此之外,这不是应该吗 CLIENT_SEQ 在持久化 Client ? 在我看来,您应该使用以下内容:

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

}

相关问题