带有 JPA 和 Hibernate 的复合键

壁虎

在这段代码中,我试图用那个模型类生成一个复合键,但是当我执行 post 方法时抛出一个异常。

我使用 postgres 作为数据库。然后我需要休眠自动生成“RA”和Idprojeto。

模型 ID 类

   @Data
   @EqualsAndHashCode(onlyExplicitlyIncluded = true)
   @AllArgsConstructor
   @NoArgsConstructor
   class ProjetoId implements Serializable{
   Long idProjeto;
   Long ra;
  }

模型实体

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

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

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

@Valid
@NotNull
@ElementCollection
private List<ProdutoToProjeto> produtos = new ArrayList<>();

@EqualsAndHashCode.Include
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@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();
}

}

错误

   java.lang.IllegalArgumentException: Can not set java.lang.Long field com.ciasense.apiciasense.model.ProjetoId.ra to org.hibernate.id.IdentifierGeneratorHelper$2
    at java.base/jdk.internal.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167) ~[na:na]
    at java.base/jdk.internal.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171) ~[na:na]
    at java.base/jdk.internal.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.java:81) ~[na:na]
    at java.base/java.lang.reflect.Field.set(Field.java:778) ~[na:na]
露西亚

如果您使用 DB SEQUENCE 作为自动生成类型,则只有复合键才能工作。否则,您必须编写自定义键生成器并在插入之前为复合键的两个字段分配值。

@EqualsAndHashCode.Include
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
@Column(name = "id_projeto")
private Long idProjeto;

@EqualsAndHashCode.Include
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
@Column(name = "ra")
private Long ra;

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

JPA和Hibernate-具有外键的复合主键

JPA / Hibernate-具有外键的复合主键

jpa hibernate复合外键映射

如何使用 Spring data JPA 和 Hibernate 添加复合外键?

带有额外列的ManyToMany关系,并且没有使用Spring和Hibernate的复合键概念

带有外键的 Java Spring Data JPA 复合 ID

带有GeneratedValue的Hibernate 3复合键一

带有计数和谓词的Hibernate JPA CriteriaQuery

带有JPA和Hibernate的ORM:EntityManager为null

JPA / Hibernate复合主前键ManyToOne映射

HibernateQueryException带有映射带有Hibernate 2.1.7版的复合键的类

春季启动JPA中的带有序列的JPA复合键

无法将JPA EntityManagerHolder强制转换为带有Spring 5.1和Hibernate 5.3的Hibernate SessionHolder

使用JPA映射复合主键和外键

Hibernate的复合键和重叠的领域 - 如何避免重复列

在Spring上,如何使用JPA和复合键(分区键和排序键)查询DynamoDB表?

Hibernate和JPA有什么区别?

没有JPA的Spring和Hibernate

具有OneToMany和ManyToOne外键类型关系的JPA Hibernate空指针异常

JPA中的复合键

JPA复合键+序列

JPA复合外键

Hibernate批注:具有共享复合键属性的多对多

如何使用Hibernate与现有对象创建复合键对象

带有Myql和Spring Boot 1.5.7的Hibernate Spatial JPA无法正常工作

如何使用 jpa 和 hibernate 导入带有多个语句的脚本

¿创建产品功能?在带有外键的JPA Hibernate Spring-boot中

带有“间隔”的JPA Hibernate查询的问题

带有复合主键的 JPA @OneToMany