奇怪的和重复的UUID一直在生成

时间:2020-02-18 13:55:48

标签: java spring hibernate duplicates uuid

我的Spring Boot应用程序存在一个不可解决的问题(使用Oracle Java 8,Hibernate和Oracle DB)。
日志中出现以下错误:
WARN o.h.e.jdbc.spi.SqlExceptionHelper.logExceptions-SQL错误:1,SQLState:23000
错误o.h.e.jdbc.spi.SqlExceptionHelper.logExceptions-ORA-00001:违反了唯一约束(MY_SCHEMA.SYS_C0057302)

此约束(SYS_C0057302)是UUID为UNIQUE。 (UUID VARCHAR2(32)NOT NULL UNIQUE)

我不能引起这种在本地运行它的行为(即使使用负载测试)-在Windows本地看起来不错,但是在RHEL(部署它的位置)上,问题一直存在。

请注意,我还有十几个实体类,每个实体类都具有UUID,但只有此类始终在生成此类奇怪的重复项。

不知道如何解决它。找不到根本原因。

下面使用的UUID和类的示例:

开始时会有一些普通的UUID,但是一段时间后会创建奇怪且重复的UUID。在2个不同的RHEL环境中。

普通UUID的示例:
0C34561DD75D422CAD652715DF6C6E75
0CB86A03945040B9886752CC07EB116E
0DAA1A3AF2B5438F8CB9489348A92223
0EAE079E621B4D2B8E8BE445F76B14C9
0FCF05797E7E40DE8D3A9D6A3B44AAE1
12DEBCAB53C94285A4C3FF32C5A0BF8E
132A877F404D44069F78D9B74DD4BDC9
1338A8CE09B14552B78CBAD640A3CF29
136310C44374412FB5B1B8FAF7E35330

由UUID.randomUUID()生成的奇怪UUID的示例-99%的UUID非常相似,其中3个数字很多:
33333330333433363333333233333339
33333330333433363333333333333336
33333330333433363333333433333330
33333330333433363333333433333332
33333330333433363333333433333333
33333330333433363333333533333330
33333330333433363333333533333333
33333330333433363333333533333339
33333330333433363333333533343332
33333330333433363333333633333332
33333330333433363333333633333334
33333330333433363333333733333333
33333330333433363333333733343335
33333330333433363333333833333333
33333330333433363333333933333332

TaskEntity类:

import lombok.Builder;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import ----DashboardTaskDto;
import ----SimpleUserDto;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EntityListeners;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.UUID;

@Getter
@Setter
@NoArgsConstructor
@Entity
@Table(name = "TASK")
@ToString
@EntityListeners(AuditingEntityListener.class)
@Slf4j
class TaskEntity {

    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "TASK_SEQ")
    @SequenceGenerator(sequenceName = "TASK_SEQ", allocationSize = 1, name = "TASK_SEQ")
    @Id
    private Long id;

    @Column(name = "KKF")
    private String kkf;

    @EqualsAndHashCode.Include
    private UUID uuid = UUID.randomUUID();

    private String customerName;
    private String assignedUserName;
    private String assignedUserRole;
    private int dpd;
    private Boolean bgk;
    private String courtProceedings;
    private String name;
    private LocalDateTime dueDate;
    private LocalDateTime doneDate;
    private BigDecimal totalLiabilities;
    private Long issueActivityId;
    private String userId;

    @Enumerated(EnumType.STRING)
    private TaskStatus status;

    @CreatedDate
    private LocalDateTime created;

    @LastModifiedDate
    private LocalDateTime modified;

    @Builder
    public TaskEntity(String kkf, String customerName, String assignedUserName, String assignedUserRole, int dpd, Boolean bgk, String courtProceedings, String name, LocalDateTime dueDate, LocalDateTime doneDate, BigDecimal totalLiabilities, Long issueActivityId, String userId, TaskStatus status, LocalDateTime created, LocalDateTime modified) {
        this.kkf = kkf;
        this.customerName = customerName;
        this.assignedUserName = assignedUserName;
        this.assignedUserRole = assignedUserRole;
        this.dpd = dpd;
        this.bgk = bgk;
        this.courtProceedings = courtProceedings;
        this.name = name;
        this.dueDate = dueDate;
        this.doneDate = doneDate;
        this.totalLiabilities = totalLiabilities;
        this.issueActivityId = issueActivityId;
        this.userId = userId;
        this.status = status;
        this.created = created;
        this.modified = modified;
    }

任务存储库类:

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.data.repository.Repository;
import org.springframework.lang.Nullable;

import java.util.Optional;

interface TaskRepository extends Repository<TaskEntity, Long> {
    TaskEntity save(TaskEntity from);

    Optional<TaskEntity> findByIssueActivityId(Long id);

    Page<TaskEntity> findAll(@Nullable Specification<TaskEntity> spec, Pageable pageable);
}

用于实体创建/更新的TaskCreator:

class TaskCreator {
   public TaskEntity from(IssueActivityEntity issueActivityEntity) {
       IssueEntity issue = issueActivityEntity.getIssue();
       CustomerEntity customer = issue.getCustomer();
       UserEntity user = issueActivityEntity.getUser();
       return TaskEntity.builder()
           .kkf(customer.getKkf())
           .customerName(customer.getCompanyName())
           .assignedUserName(user.getName())
           .assignedUserRole(user.getRole())
           .dpd(issue.retrieveMaxDpd())
           .bgk(customer.isBgk())
           .courtProceedings(customer.getCourtProceedings())
           .name(issueActivityEntity.getActivity().getStatus())
           .dueDate(issueActivityEntity.getDueDate())
           .doneDate(issueActivityEntity.getDoneDate())
           .totalLiabilities(customer.getTotalLiabilities())
           .issueActivityId(issueActivityEntity.getId())
           .status(issueActivityEntity.getStatus())
           .userId(user.getId())
           .build();
   }

   TaskEntity updateFrom(final TaskEntity task, final IssueActivityEntity ia) {
       IssueEntity issue = ia.getIssue();
       CustomerEntity customer = issue.getCustomer();
       UserEntity user = ia.getUser();
       task.setKkf(customer.getKkf());
       task.setCustomerName(customer.getCompanyName());
       task.setAssignedUserRole(user.getRole());
       task.setDpd(issue.retrieveMaxDpd());
       task.setBgk(customer.isBgk());
       task.setCourtProceedings(customer.getCourtProceedings());
       task.setName(ia.getActivity().getStatus());
       task.setDueDate(ia.getDueDate());
       task.setDoneDate(ia.getDoneDate());
       task.setTotalLiabilities(customer.getTotalLiabilities());
       task.setIssueActivityId(ia.getId());
       task.setStatus(ia.getStatus());
       task.setUserId(user.getId());
       return task;
   }
}


更新1:
我尝试设置-Djava.security.egd = file:/ dev /./ urandom,但这根本没有帮助。

0 个答案:

没有答案
相关问题