Spring JPA Hibernate Optimisti c Блокировка Почему объект обновляется после вставки - PullRequest
0 голосов
/ 20 июня 2020

SQL журналы:

Hibernate: insert into author (...)
Hibernate: insert into "user" (...)
Hibernate: select author0_.id...
Hibernate: select user0_.id...
Hibernate: insert into book (...)
Hibernate: update book set...

Итак, я попытался создать новую книгу с новой ссылкой на автора и «ссылкой» пользователя, который одолжил книгу.

Я не понимаю, почему сущность книги обновляется после вставки. Я также использую optimisti c для управления версиями для авторов и пользователей, но проблем нет.

@Data
@NoArgsConstructor
@MappedSuperclass
@TypeDefs({
        @TypeDef(name = "jsonb", typeClass = JsonBinaryType.class)
})
public abstract class StandardEntity implements Serializable {
}

@Data
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor
@AllArgsConstructor
@MappedSuperclass
public abstract class IdentifiableEntity extends StandardEntity {
    @Id
    @GeneratedValue
    @Column(columnDefinition = "uuid", updatable = false)
    private UUID id;
}
@Data
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor
@AllArgsConstructor
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class AuditableEntity extends IdentifiableEntity {
    @CreatedDate
    private LocalDateTime created;
    @CreatedBy
    private String createdBy;
    @LastModifiedDate
    private LocalDateTime modified;
    @LastModifiedBy
    private String modifiedBy;
    private LocalDateTime deleted;
    @Version
    private long version;

    public AuditableEntity(UUID id) {
        super(id);
    }
}
@Data
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor
@AllArgsConstructor
@Entity
public class Author extends AuditableEntity {
    @NotNull
    private String code;
    private String title;

    public Author(UUID id) {
        super(id);
    }
}

@Data
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor
@AllArgsConstructor
@Entity
public class Book extends AuditableEntity {
    @ManyToOne
    @JoinColumn(name = "author_id", nullable = false)
    private Author author;
    private String title;
    private String borrower;
    @Type(type = "jsonb")
    private Map<String, Object> details;
    @Type(type = "jsonb")
    private Set<Custom1Dto> pages;
    @Type(type = "jsonb")
    private List<Custom2Dto> components;
    @NotNull
    @Enumerated(EnumType.STRING)
    private BookStatus status;
    
    public Book(UUID id) {
        super(id);
    }
}

Поэтому я хочу знать, почему происходит обновление книги . Почему спящий режим увеличивает версию текущего вставленного объекта.

ОБНОВЛЕНИЕ

Я заметил, что если я закомментирую коллекцию компонентов, проблема с обновлением исчезнет.

ОБНОВЛЕНИЕ

Похоже, проблема была с Custom2Dto

@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Custom2Dto extends StandardDto {
    private String title;
}

и StandardDto

public abstract class StandardDto implements Serializable {
}

RESLVED

добавление @EqualsAndHashCode в StandardD для решения проблемы

@Data
@NoArgsConstructor
@ToString
@EqualsAndHashCode
public abstract class StandardDto implements Serializable {
}
...