Tag: jpa

org.hibernate.HibernateException:当“hibernate.dialect”未设置时,对DialectResolutionInfo的访问不能为null

我试图运行一个春季启动应用程序使用hibernate通过spring-jpa,但我得到这个错误: Caused by: org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set at org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.determineDialect(DialectFactoryImpl.java:104) at org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.buildDialect(DialectFactoryImpl.java:71) at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.java:205) at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:111) at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:234) at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:206) at org.hibernate.cfg.Configuration.buildTypeRegistrations(Configuration.java:1885) at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1843) at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:850) at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:843) at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.withTccl(ClassLoaderServiceImpl.java:398) at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:842) at org.hibernate.jpa.HibernatePersistenceProvider.createContainerEntityManagerFactory(HibernatePersistenceProvider.java:152) at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:336) at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:318) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1613) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1550) … 21 more 我的pom.xml文件是这样的: <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> […]

将IN子句列表添加到JPA查询

我build立了一个如下所示的NamedQuery: @NamedQuery(name = "EventLog.viewDatesInclude", query = "SELECT el FROM EventLog el WHERE el.timeMark >= :dateFrom AND " + "el.timeMark <= :dateTo AND " + "el.name IN (:inclList)") 我想要做的是填写参数:inclList与物品清单,而不是一个项目。 例如,如果我有一个new List<String>() { "a", "b", "c" }我如何得到:inclList参数? 它只能让我编一个string。 例如: setParameter("inclList", "a") // works setParameter("inclList", "a, b") // does not work setParameter("inclList", "'a', 'b'") // does not work […]

JPA和Criteria API – 只select特定的列

我只想select特定的列(例如SELECT a FROM b )。 我有一个通用的DAO,我想到的是: public List<T> getAll(boolean idAndVersionOnly) { CriteriaBuilder builder = manager.getCriteriaBuilder(); CriteriaQuery<T> criteria = builder.createQuery(entityClazz); Root<T> root = criteria.from(entityClazz); if (idAndVersionOnly) { criteria.select(root.get("ID").get("VERSION")); // HERE IS ERROR } else { criteria.select(root); } return manager.createQuery(criteria).getResultList(); } 错误是: The method select(Selection<? extends T>) in the type CriteriaQuery<T> is not applicable for the arguments […]

在纯JPA设置中获取数据库连接

我们有一个JPA应用程序(使用hibernate),我们需要传递一个需要JDBC数据库连接作为参数的传统报告工具。 有一个简单的方法来获得访问的JDBC连接hibernate设置?

实现Spring Data repository的自定义方法并通过REST公开它们

我试图将自定义方法添加到Spring数据存储库PersonRepository ,如1.3 Spring数据存储库的自定义实现中所述,并通过REST公开这些方法。 最初的代码是从REST示例访问JPA数据 ,这里是添加/修改类的代码: interface PersonRepositoryCustom { List<Person> findByFistName(String name); } class PersonRepositoryImpl implements PersonRepositoryCustom, InitializingBean { @Override public void afterPropertiesSet() throws Exception { // initialization here } @Override public List<Person> findByFistName(String name) { // find the list of persons with the given firstname } } @RepositoryRestResource(collectionResourceRel = "people", path = "people") public interface […]

Spring Boot + JPA:忽略列名称注释

我有一个Spring引导应用程序依赖“spring-boot-starter-data-jpa”。 我的实体类具有列名称的列注释。 例如: @Column(name="TestName") private String testName; 由此创build的test_name作为列名生成的SQL。 find解决scheme后,我发现spring.jpa.hibernate.naming_strategy=org.hibernate.cfg.EJB3NamingStrategy解决了问题(列名取自列注释)。 不过,我的问题是,为什么没有将naming_strategy设置为EJB3NamingStrategy JPA忽略了列注释? 也许冬眠方言有什么关系呢? 我正在连接到MS SQL 2014 Express,我的日志包含: Unknown Microsoft SQL Server major version [12] using SQL Server 2000 dialect Using dialect: org.hibernate.dialect.SQLServerDialect

Java – JPA – @Version注释

@Version注解如何在JPA中工作? 我find了各种答案,其摘录如下: JPA在您的实体中使用版本字段来检测对同一数据存储logging的并发修改。 当JPA运行时检测到试图同时修改相同的logging时,它会向最后提交的事务抛出一个exception。 但我仍然不确定它是如何工作的。 还从以下几行开始: 你应该考虑版本字段不可变。 更改字段值有未定义的结果。 这是否意味着我们应该宣布我们的版本字段是final ?

JPA:迭代大型结果集的正确模式是什么?

比方说,我有一个数百万行的表。 使用JPA,迭代对该表的查询的正确方法是什么,这样我就不会拥有数百万个对象的所有内存列表 ? 例如,如果桌子很大,我怀疑以下情况会炸毁: List<Model> models = entityManager().createQuery("from Model m", Model.class).getResultList(); for (Model model : models) { System.out.println(model.getId()); } 是分页(循环和手动更新setFirstResult() / setMaxResult() )真的是最好的解决scheme? 编辑 :我要定位的主要用例是一种批处理作业。 如果运行时间很长,这很好。 没有涉及networking客户端; 我只需要为每一行“做一些事情”,一次一个(或者一些小N)。 我只是想尽量避免让他们在记忆中。

在JPA / Hibernate中正确使用flush()

我正在收集有关flush()方法的信息,但是我不清楚何时使用它以及如何正确使用它。 从我读到的内容来看,我的理解是持久化上下文的内容将与数据库同步,即发出未完成的语句或刷新实体数据。 现在我有两个实体A和B (一对一的关系,但没有强制执行或由JPAbuild模)的以下情况。 A有一个手动设置的组合PK,还有一个自动生成的IDENTITY字段recordId 。 这个recordId应该写入实体B作为A一个外键。 我在一次交易中保存A和B 问题是自动生成的值A.recordId在事务中不可用,除非在A上调用em.persist()之后,明确调用em.flush() 。 (如果我有一个自动生成的IDENTITY PK,那么值直接在实体中更新,但这不是这种情况。) 在事务中使用em.flush()会造成什么危害?

如何在JPA(和相应的连接表行)中删除具有ManyToMany关系的实体?

假设我有两个实体:组和用户。 每个用户可以是多个组的成员,每个组可以有多个用户。 @Entity public class User { @ManyToMany Set<Group> groups; //… } @Entity public class Group { @ManyToMany(mappedBy="groups") Set<User> users; //… } 现在我想删除一个组(假设它有很多成员)。 问题是当我在某个Group上调用EntityManager.remove()时,JPA提供者(在我的情况下是Hibernate) 不会从连接表中删除行,并且由于外键约束,删除操作失败。 在用户上调用remove()可以正常工作(我想这与拥有关系的一方有关)。 那么在这种情况下我该如何删除一个组? 我唯一能想到的方式是加载组中的所有用户,然后为每个用户从他的组中删除当前组并更新用户。 但是,对于我来说,只要能够删除这个组就可以调用组中的每个用户的update(),这似乎是荒谬的。