有没有一种方法可以将@id列generateValue复制到同一实体的另一列?

时间:2020-03-16 21:02:53

标签: hibernate spring-boot jpa

我在SpringBoot JPA服务中有一个要求,即该列的主键值必须存储在同一实体的另一列中。在下面的示例中,rowIdStringPrefixedLineSequenceIdGenerator生成。无论它产生什么值,我都需要将其存储在lineId列中。

@Entity
@Table(name="CX_LINE")
public class CXLine {

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "cx_line_seq")
@GenericGenerator(
    name = "cx_line_seq", 
    strategy = "com.tmo.chub.entity.generator.StringPrefixedLineSequenceIdGenerator"/*, 
                parameters = {@Parameter(name = StringPrefixedLineSequenceIdGenerator.VALUE_PREFIX_PARAMETER, value = "2-XP-"),
                              @Parameter(name = StringPrefixedLineSequenceIdGenerator.NUMBER_FORMAT_PARAMETER, value = "%04d")}*/)
   @Column(name="row_id")
   private String rowId;

   @Column(name="LINE_ID")
   private String lineId;

   //getters & setters
}

问题是,@id的值直到repo.save()才对我可用。有没有办法从休眠会话或其他方法中获取generatedValue?或者是否可以将@GeneratedValue@GenericGenerator用于@id以外的其他列? 我目前正在保存2次。我将用唯一值(输入中输入)保存新的CXline,然后再次进行更新,如下所示。感谢这里的任何输入。

CXLine existingLine = lineRepo.findByExtLineId(payload.getCustomerProfile().getCustomerId());

if(existingLine !=null){
   //do update
}
else{
   CXLine newLine = new CXLine();   
   newLine.setLineId(payload.getCustomerProfile().getCustomerId());
   // set other columns
   lineRepo.save(newLine);

   CXLine lineToUpdateLineId = lineRepo.findByExtLineId(payload.getCustomerProfile().getCustomerId());
   lineToUpdateLineId.setLineId(lineToUpdateLineId.getRowId());
   lineRepo.save(newLine);  
}

1 个答案:

答案 0 :(得分:0)

您可以通过不同的方式实现相同的功能。 如果您不想两次保存同一对象 然后,首先使用@query批注以及存储库上的本机SQL查询来生成序列。

示例

@Query(value = "SELECT cx_line_seq.NEXTVAL FROM DUAL", nativeQuery = true)
    public Long getCxLineId();

然后将值设置为列并保存。 如果您使用上述方法,则需要从Entity类中删除序列生成器