【问题标题】:One to Many Mapping Persist Collection一对多映射持久化集合
【发布时间】:2021-10-16 03:51:50
【问题描述】:

我需要一些帮助,我正在尝试创建一个系统,但我有一个问题来坚持骰子,所以我想要的是:

我有两个表:项目和产品

在项目中我想持久化一组产品,但我不需要产品知道它们链接了哪些项目,所以它就像一对多单向关系。

我想知道如何在数据库(Postgres)和 Hibernate 中映射它,以及如何制作 PostMapping。

数据库中的表

create table if not exists produto(
id_produto bigserial not null,
codigo varchar(20) not null,
nomenclatura varchar(60) not null,
preco numeric(5,2),
aplicacao varchar(60),
dosagem decimal(5,2),
inspiracao varchar(60),
amostra varchar(10),
constraint pk_produto primary key(id_produto));

create table if not exists projeto (
id_projeto bigserial not null,
id_cliente bigint not null,
id_produto bigint,

data_criacao timestamp not null default current_timestamp,
ra bigserial not null,
situacao varchar(20),

constraint pk_projeto primary key(id_projeto, ra),

constraint fk_projeto_cliente foreign key(id_cliente) 
references cliente(id_cliente) ON DELETE CASCADE ON UPDATE CASCADE,

constraint fk_projeto_produto foreign key(id_produto)
references produto(id_produto) ON DELETE CASCADE ON UPDATE CASCADE);

模型类项目

@Entity
@Data
@IdClass(ProjetoId.class)
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
@Table(name = "projeto", schema = "public")
public class Projeto {

@EqualsAndHashCode.Include
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "PRO_SEQ")
@SequenceGenerator(name="PRO_SEQ", sequenceName="PROJETO_SEQ", initialValue=1, allocationSize=1)
@Column(name = "id_projeto")
private Long idProjeto;

@Valid
@ConvertGroup(from = Default.class, to = ValidationGroups.ClienteId.class)
@NotNull
@ManyToOne(cascade = CascadeType.ALL)
private Cliente cliente;

@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "id_produto", insertable = false, updatable = false)
private List<Produto> produtos = new ArrayList<>();

@EqualsAndHashCode.Include
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "PRO_SEQ")
@SequenceGenerator(name="PRO_SEQ", sequenceName="PROJETO_SEQ", initialValue=1, allocationSize=1)
@Column(name = "ra")
private Long ra;

@JsonProperty(access = JsonProperty.Access.READ_ONLY)
@Enumerated(EnumType.STRING)
@Column(name = "situacao")
private StatusProjeto situacao;

@JsonProperty(access = JsonProperty.Access.READ_ONLY)
@Column(name = "data_criacao")
private LocalDate dataRegistro;

public void finalizar() {
    if(naoPodeSerFinalizado()) {
        throw new ProjetoException("Projeto não pode ser finalizado");
    }
    setSituacao(StatusProjeto.APROVADO);
}

public void cancelar() {
    if(naoPodeSerFinalizado()) {
        throw new ProjetoException("Projeto não pode ser cancelado");
    }
    setSituacao(StatusProjeto.RECUSADO);
}

public boolean podeSerFinalizado() {
    return StatusProjeto.PEDENTE.equals(getSituacao());
}

public boolean naoPodeSerFinalizado() {
    return !podeSerFinalizado();
}

}

模型类产品

@Entity
@Data
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
@Table(name = "produto",schema = "public")
public class Produto {

@Id
@EqualsAndHashCode.Include
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id_produto")
private Long idProduto;

@NotBlank
@Column(name ="codigo")
@Size(max = 60)
private String codigo;

@NotBlank
@Size(max = 60)
@Column(name = "nomenclatura")
private String nomenclatura;

@NotNull
@Column(name = "preco")
private Double preco;

@Size(max = 60)
@Column(name = "aplicacao")
private String aplicacao;

@DecimalMin(value = "0.00")
@Digits(integer = 3, fraction = 2)
@Column(name = "dosagem")
private Double dosagem;

@Size(max = 60)
@Column(name = "inspiracao")
private String inspiracao;

@Size(max = 10)
@Column(name = "amostra")
private String amostra;

}

错误

A Foreign key refering com.ciasense.apiciasense.model.Projeto from com.ciasense.apiciasense.model.Produto has the wrong number of column. should be 2

【问题讨论】:

    标签: java postgresql jpa spring-data-jpa hibernate-mapping


    【解决方案1】:

    外键列不能与现有列相同。

    在这种情况下,将 Produto 类中的主键 idProduto 和列名 id_produto 重命名为 id 应该可以解决它。实际上,id 的上下文是绑定在 Produto 类中的,因此不需要在名称中提及。

    【讨论】:

      猜你喜欢
      • 2011-03-10
      • 1970-01-01
      • 2013-06-02
      • 2013-11-15
      • 1970-01-01
      • 1970-01-01
      • 2013-12-16
      • 2017-05-10
      • 2020-12-05
      相关资源
      最近更新 更多