Я использую Hibernate в качестве провайдера JPA. Я выбрал account
сущность из базы данных и detached
это. Таким образом, объект учетной записи должен теперь находиться в отключенном состоянии.
Теперь, когда я пытаюсь persist
отсоединить сущность, я ожидал, что она потерпит неудачу, так как метод entitymananger.persist
работает только на transient
и managed
сущностях. Но он выполняет INSERT-запрос к базе данных.
Продолжая отладку реализации entitymananger.persist
, я обнаружил, что она рассматривает сущность счета как TRANSIENT
. Я поставил точку останова здесь , чтобы увидеть состояние объекта,
Код, используемый для тестирования:
@RunWith(SpringRunner.class)
@SpringBootTest(classes = MainApplication.class)
public class HibernateTest {
@PersistenceContext
private EntityManager entityManager;
@Test
@Transactional
@Commit
public void testDetached() {
Account account = entityManager.find(Account.class, 1); // account is now managed entity
entityManager.detach(account); // detach the account entity
entityManager.persist(account);// entityManager is treating account as transient object and ran INSERT query on the database
}
}
Добавление класса учетной записи
@Entity
@lombok.Data
@Table(name = "account")
class Account {
@Id
@Column(name = "userid")
private int userid;
@Column(name = "balance")
private int balance;
}
Мои вопросы:
- Почему
entitymanager.persist
рассматривает detached
сущность как transient
?
- Я попытался понять определение Hibernate того, является ли объект
transient
или detached
( код ). логика сложна и не может усвоить, почему это делается так, как это делается.
Пожалуйста, дайте мне знать, если вам нужна дополнительная информация. Спасибо.