Изменяя данные в одной сущности, изменяются данные и в другой
Использую:
- 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);
}