Изменяя данные в одной сущности, изменяются данные и в другой

Использую:

  • Java: 15.0.1
  • Spring-boot: 2.4.0
  • MySQL-connector: 8.0.22

У меня есть сущность, допустим, Review и я заметил аномальное явление во время тестирования ReviewRepository: когда двум новым сущностям я присваиваю одно и тоже данное из таблицы, то ищменяя данные в одной сущности, меняются данные и в другой сущности. Почему так происходит и как этого избежать?

P.S. Пример вывода есть в коде ниже

Тест, в котором происходит аномалия:

@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class ReviewRepositoryTest {

    @Autowired
    private ReviewRepository repository;

    private ReviewEntity savedEntity;

    @BeforeEach
    void setUp() {
        repository.deleteAll();
        repository.flush();
        ReviewEntity entity = new ReviewEntity(1, 2, "a", "s", "c");
        savedEntity = repository.saveAndFlush(entity);
        assertEqualsReview(entity, savedEntity);
    }

    @Test
    @Order(1)
    void optimisticLockError() {
        
        // Store the saved entity in two separate entity objects
        ReviewEntity entity1 = repository.findById(savedEntity.getId()).get();
        ReviewEntity entity2 = repository.findById(savedEntity.getId()).get();

//      ReviewEntity(id=292, version=0, productId=1, reviewId=2, author=a, subject=s, content=c)
//      ReviewEntity(id=292, version=0, productId=1, reviewId=2, author=a, subject=s, content=c)
        System.out.println(entity1);
        System.out.println(entity2);
        System.out.println();

        // Update the entity using the first entity object
        entity1.setAuthor("a1");

//      ReviewEntity(id=293, version=0, productId=1, reviewId=2, author=a1, subject=s, content=c)
//       ReviewEntity(id=293, version=0, productId=1, reviewId=2, author=a1, subject=s, content=c)
        System.out.println(entity1);
        System.out.println(entity2);
    }
}

__

Review.java:
@Entity
@Table(
        name = "reviews",
        indexes = {
                @Index(
                        name = "reviews_unique_idx",
                        unique = true,
                        columnList = "productId,reviewId"
                )
        }
)
@NoArgsConstructor
@Getter
@Setter
@ToString
public class ReviewEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    @Version
    private int version;

    private int productId;
    private int reviewId;
    private String author;
    private String subject;
    private String content;

    public ReviewEntity(int productId, int reviewId, String author, String subject, String content) {
        this.productId = productId;
        this.reviewId = reviewId;
        this.author = author;
        this.subject = subject;
        this.content = content;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        ReviewEntity that = (ReviewEntity) o;
        return id == that.id;
    }

    @Override
    public int hashCode() {
        return Objects.hash(id);
    }
}
ReviewRepository:
@Repository
public interface ReviewRepository extends JpaRepository<ReviewEntity, Integer> {

    @Transactional(readOnly = true)
    List<ReviewEntity> findByProductId(int productId);
}

Ответы (0 шт):