【发布时间】:2021-08-28 10:25:46
【问题描述】:
我有一个包含 30 个左右实体的工作应用程序。主要使用自动生成查询的 CRUD 存储库。现在,有些查询没有优化,我想使用 Entity Graph 系统来连接其中的一些表。
到目前为止一切顺利,我遵循了几个教程并编写了代码。剩下的唯一问题是,当我运行它时,我收到了这个错误:
Not an entity: class com.stingray.syncmanager.models.StationRoleModel
这很奇怪,因为就像我之前所说的,我的应用程序已经使用了这个实体。在我看来,实体管理器或会话没有“意识到”这些实体的存在,就像它们在单独的“上下文”中一样,如果这有意义的话。
谁能指出我正确的方向?这是我的代码:
CustomSqlRepository.java
public CustomSqlRepository(HibernateConfig hibernateConfig, EntityManager entityManager) {
Map<String, String> settings = new HashMap<>();
settings.put("connection.driver_class", hibernateConfig.getDriverClassName());
settings.put("hibernate.connection.url", hibernateConfig.getConnectionUrl());
settings.put("hibernate.connection.username", hibernateConfig.getUsername());
settings.put("hibernate.connection.password", hibernateConfig.getPassword());
settings.put("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");
settings.put("hibernate.current_session_context_class", "thread");
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
.applySettings(settings).build();
MetadataSources metadataSources = new MetadataSources(serviceRegistry);
Metadata metadata = metadataSources.buildMetadata();
sessionFactory = metadata.getSessionFactoryBuilder().build();
this.entityManager = entityManager;
}
public Session getCurrentSession() {
return sessionFactory.getCurrentSession();
}
@Override
public List<StationRoleModel> findAllByRole(RoleModel role) {
EntityGraph<?> graph = entityManager.getEntityGraph("stationrole-entity-graph-with-station");
try (Session session = getCurrentSession()) {
Transaction transaction = session.beginTransaction();
CriteriaBuilder builder = session.getCriteriaBuilder();
//===================================================================
//This line crashes with "Not an entity" which doesn't make sense at all because it IS an entity...
//===================================================================
CriteriaQuery<StationRoleModel> criteria = builder.createQuery(StationRoleModel.class);
Root<StationRoleModel> from = criteria.from(StationRoleModel.class);
criteria.select(from);
criteria.where(builder.equal(from.get("role"), role));
TypedQuery<StationRoleModel> typed = entityManager
.createQuery(criteria)
.setHint("javax.persistence.fetchgraph", graph);
try {
return typed.getResultList();
} catch (final NoResultException nre) {
return new ArrayList<>();
} finally {
transaction.commit();
}
}
}
StationRoleModel.java
@Entity(name = "StationRoleModel")
@Table(name = "station_role")
@Getter
@Setter
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@NoArgsConstructor(access = AccessLevel.PUBLIC)
@NamedEntityGraph(name = "stationrole-entity-graph-with-station",
attributeNodes = @NamedAttributeNode("station"))
public class StationRoleModel extends BaseEntity {
...
}
【问题讨论】:
标签: java spring-boot hibernate entity hibernate-criteria