spring 引导 JPA 中的 JPA 组合键 WITH 序列
JPA Composite Key WITH Sequence in spring boot JPA
在纯 JPA 或 Hibernate 中是否可以使用组合键,其中组合键的一个元素是一个序列,而另一个元素是使用外键映射的。
我的 table 中有一个组合键,其中的一部分需要由序列生成。
我尝试了以下方法,但它不起作用
class 产品
@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;
}
}
class 组合键:
@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);
}
}
class 客户:
@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);
}
}
不久前我遇到了同样的问题。如果您希望数据库生成其中一个 PK 字段,最好不要在您的情况下使用 @EmbeddedId。我不是 Hibernate 专家,但据我所知,Hibernate 不会尝试将值设置为 ID 字段,只有当它们被 @GeneratedValue 注释时。只有这个注释可以告诉 Hibernate 依赖数据库序列。你不能在 Embeddable class.
中做到这一点
如果要生成一个@Id 字段,请尝试只使用一个。
你的模型没有多大意义,除非我误解了它。为什么需要 FK_PRODUIT
作为主键的一部分?如果您使用 CLIENT_SEQ
的序列,这足以使该行唯一。除此之外,这个CLIENT_SEQ
值不应该在持久化一个Client
时生成吗? 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;
}
}
在纯 JPA 或 Hibernate 中是否可以使用组合键,其中组合键的一个元素是一个序列,而另一个元素是使用外键映射的。
我的 table 中有一个组合键,其中的一部分需要由序列生成。 我尝试了以下方法,但它不起作用
class 产品
@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;
}
}
class 组合键:
@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);
}
}
class 客户:
@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);
}
}
不久前我遇到了同样的问题。如果您希望数据库生成其中一个 PK 字段,最好不要在您的情况下使用 @EmbeddedId。我不是 Hibernate 专家,但据我所知,Hibernate 不会尝试将值设置为 ID 字段,只有当它们被 @GeneratedValue 注释时。只有这个注释可以告诉 Hibernate 依赖数据库序列。你不能在 Embeddable class.
中做到这一点如果要生成一个@Id 字段,请尝试只使用一个。
你的模型没有多大意义,除非我误解了它。为什么需要 FK_PRODUIT
作为主键的一部分?如果您使用 CLIENT_SEQ
的序列,这足以使该行唯一。除此之外,这个CLIENT_SEQ
值不应该在持久化一个Client
时生成吗? 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;
}
}