【发布时间】: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