Почему CrudRepository.findbyId () вернуть доверенность Hibernate?JAVA

Программисты JAVA общаются здесь
Anonymous
Почему CrudRepository.findbyId () вернуть доверенность Hibernate?

Сообщение Anonymous »

Похоже, что findbyId () и ручные запросы в весенних репозиториях могут возвращать гибернатные прокси вместо реальных объектов, если эти объекты были «загружены» ранее, как ленивые поля других объектов.
Такое поведение кажется мне немного удивительным. Это задумано? Есть ли какое-то разъяснение в документации? тот же класс и соответствующий репозиторий. < /p>
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.Id;
import jakarta.persistence.ManyToOne;

@Entity
public class ExampleEntity {

@Id
private Character id;

@ManyToOne(fetch = FetchType.LAZY)
private ExampleEntity parent;

public ExampleEntity setId(Character id) {
this.id = id;
return this;
}

public ExampleEntity setParent(ExampleEntity parent) {
this.parent = parent;
return this;
}

}
< /code>
import org.springframework.data.jpa.repository.JpaRepository;

public interface ExampleEntityRepository extends JpaRepository {
}
< /code>
Поведение воспроизводится в следующих тестах. Оба теста создают две сущности, идентифицированные A и B. Последние связывают первое. < /Th>
класс Entitya < /code> < /th>
< /tr>
< /thead>


style = "text-align: center;"> object < /td>
HibernateProxy



import org.assertj.core.api.Assertions;
import org.hibernate.proxy.HibernateProxy;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.support.TransactionTemplate;

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE)
class ExampleEntityRepositoryTest {

private final TransactionTemplate transactionTemplate;

private final ExampleEntityRepository sut;

@Autowired
ExampleEntityRepositoryTest(PlatformTransactionManager platformTransactionManager,
ExampleEntityRepository exampleEntityRepository) {
this.transactionTemplate = new TransactionTemplate(platformTransactionManager);
this.sut = exampleEntityRepository;
}

@Test
void proxy() {
try {
transactionTemplate.executeWithoutResult(status -> {
sut.save(new ExampleEntity().setId('A'));
sut.save(new ExampleEntity().setId('B').setParent(new ExampleEntity().setId('A')));
});

ExampleEntity entityA = transactionTemplate.execute(status -> {
sut.findById('B'); // Load an entity with a lazy link to the target entity.
return sut.findById('A').orElse(null);
});

Assertions
.assertThat(entityA)
.isNotNull()
.isInstanceOf(HibernateProxy.class)
.isInstanceOf(ExampleEntity.class);
} finally {
transactionTemplate.executeWithoutResult(status -> sut.deleteAll());
}
}

@Test
void object() {
try {
transactionTemplate.executeWithoutResult(status -> {
sut.save(new ExampleEntity().setId('A'));
sut.save(new ExampleEntity().setId('B').setParent(new ExampleEntity().setId('A')));
});

ExampleEntity entityA = transactionTemplate.execute(status -> {
// Load the target entity.
return sut.findById('A').orElse(null);
});

Assertions
.assertThat(entityA)
.isNotNull()
.isInstanceOf(ExampleEntity.class)
.isNotInstanceOfAny(HibernateProxy.class);
} finally {
transactionTemplate.executeWithoutResult(status -> sut.deleteAll());
}
}

}


Подробнее здесь: https://stackoverflow.com/questions/797 ... nate-proxy

Вернуться в «JAVA»