почему отдельная сущность рассматривается как переходная? - PullRequest
0 голосов
/ 26 января 2019

Я использую 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;

}

Мои вопросы:

  1. Почему entitymanager.persist рассматривает detached сущность как transient?
  2. Я попытался понять определение Hibernate того, является ли объект transient или detached ( код ). логика сложна и не может усвоить, почему это делается так, как это делается.

Пожалуйста, дайте мне знать, если вам нужна дополнительная информация. Спасибо.

1 Ответ

0 голосов
/ 26 января 2019

Объект считается ОТКЛЮЧЕННЫМ, если:

1. ID is not null (otherwise it is transient)
2. It is not managed
3. It has not been removed

Я не уверен, как вы назначаете свойство идентификатора, но я думаю, что проблема где-то там.

Оставьте генерацию идентификаторав спящий режим:

    @Id
    @GeneratedValue  <<<<<<<
    @Column(name = "userid")
    private int userid;

Это должно не пройти тест.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...