使用JPARepository/Hibernate保存对象时,它首先检查数据库中是否存在(使用主键),然后检查插入.所以我们看到2个日志:SELECT&INSERT.
这就是我想通过弹簧数据做的事情:( X和XY是2个不同的对象)
Call Save on XRepository for Object X1
Call Save on XYRepository for Object X1Y1
Call Save on XYRepository for Object X1Y2
Call Save on XYRepository for Object X1Y3
Call Save on XRepository for Object X2
Call Save on XYRepository for Object X2Y1
Call Save on XYRepository for Object X2Y2
Call Save on XYRepository for Object X2Y3
Run Code Online (Sandbox Code Playgroud)
这是我在日志中的观察结果:
SELECT X1
INSERT X1
SELECT X1Y1
SELECT X1Y2
SELECT X1Y3
INSERT X1Y1
INSERT X1Y2
INSERT X1Y3
SELECT X2
INSERT X2 …Run Code Online (Sandbox Code Playgroud) 我正在使用Spring-Data-Elastic-Search进行搜索/缓存.我需要执行一个使用子(TermCache)和父(ConceptCache)属性的查询并返回子对象的实例(这意味着我不能使用嵌套对象).
我有以下结构:
@Document(indexName = "termweb" , type = "term")
public class TermCache {
@Id
private String id;
private String name;
private LanguageDTO language;
private String status;
private String definition;
@Field(type = FieldType.String, store = true)
@Parent(type = "concept")
private Long conceptId;
private String displayId;
private Map<Long, String> fields = new HashMap<>();
//todo think about storing it as a collection of nested objects
}
@Document( indexName = "termweb" , type = "concept")
public class ConceptCache implements ConceptDTO{
@Id
private String id; …Run Code Online (Sandbox Code Playgroud) 我正在尝试获取特定组中的用户数量,我已完成以下操作:
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Long> q = cb.createQuery(Long.class);
q.select(cb.count(q.from(User.class))).where(cb.equal(q.from(User.class).get("userGroup"), groupId));
Run Code Online (Sandbox Code Playgroud)
但是,不是获取组中的用户数,而是将此数字乘以表中所有用户的数量,生成的ORM请求如下所示:
Hibernate: select count(*) as col_0_0_ from app_user user0_ cross join app_user user1_ where user1_.user_group=1
Run Code Online (Sandbox Code Playgroud)
编辑:
这是我的用户模型:
public class User {
private String userFirstName;
private String userLastName;
/* some stuff */
@ManyToOne
private Group userGroup;
}
Run Code Online (Sandbox Code Playgroud)
我的组模型有一个用@Id和named id注释的int属性.在这种情况下,如何获取组ID的用户数?
我正在将 mongodb 与 spring 一起使用,并且我有一些从一个基类派生的子文档,mongo 使用“_class”属性来找出要转换为的正确类型,但现在我更改了包名称,集合仍然有旧包名称的文档,我如何告诉 mongo 进行哪些自定义转换?
我试图从我的数据库中删除大量的记录.每个记录都有一个外键级联,这样,当通过JPA一次删除一条记录时,每次删除需要大约5秒.
所以我决定写一个像这样的JPQL查询:
@Repository
public interface MyTableRepository extends JpaRepository<MyTable, Long> {
@Query("delete from MyTable where id in :ids")
void deleteAllIds(@Param("ids") Long[] ids);
}
Run Code Online (Sandbox Code Playgroud)
当我运行它或等效时void deleteAllIds(@Param("ids") Set<Long> ids);,我得到以下内容:
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.hql.internal.QueryExecutionRequestException: Not supported for DML operations [delete from com.lh.clte.domain.content.business.Hotel where id in (:ids_0_, :ids_1_, :ids_2_, :ids_3_, ... for the entire array size)]
org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:293)
org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:403)
org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:59)
org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:213)
org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:147)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodIntercceptor.invoke(CrudMethodMetadataPostProcessor.java:111)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
com.sun.proxy.$Proxy72.deleteAllId(Unknown Source)
Run Code Online (Sandbox Code Playgroud)
我怎样才能实现目标?
当在 RestCall 中使用 Spring Data 时,会有一个 Session,Hibernate 在其中缓存数据。在一个 RestCall 中加载一个新实体会导致 Hibernate 缓存该实体,直到 RestCall 完成。当加载大量数据时,Sprng 会显着减慢,因为 Hibernate 正在积累更多数据。Java 实体没有被收集,因为 Hibernate 仍然有对它的引用。
在以下代码中,前约 100 个实体按预期进行处理。之后,此 RestCall 中的执行速度逐渐减慢。现在的问题是为什么这会减慢 RestCall 代码的执行速度。有足够的 RAM 可用,即使没有,我也希望抛出 OOM。为什么越来越慢?元素数量少于 1500,对于 Java/Spring 来说不应该成为问题。
public void someMethodCalledFromRestController() {
List<String> allRelevantNumbers = someService.findNumbers();
for (String number : allRelevantNumbers) {
List<Customers> customersGroup = someService.findActiveCustomersByNumber(number); // includes a repository.find(); method
this.workOnCustomerGroup(customersGroup);
}
}
....
public void workOnCustomerGroup(List<Customers> customersGroup) {
try {
LocalDateTime startWorkTime = LocalDateTime.now();
Result result = someService.doSomeWork(customersGroup);
resultService.createResult(result); // includes repository.save();
// …Run Code Online (Sandbox Code Playgroud) 我正在使用Spring Data和QueryDSL,如Gierke在他的博客文章中所述.一切都在工作,并且实现起来相对简单,但我现在已达到了一个需要分页和排序的数据视图.但是,似乎必须选择其中一个.为什么是这样?是否真的没有办法同时获得两者?到目前为止,我们已经花费了大量时间和精力来实现所有目标,如果陷入这样一个看似简单的任务,那将是一种耻辱.
简而言之,我需要创建一个方法,该方法采用QueryDSL谓词,可分页和某种形式的排序对象来提供过滤,分页和排序的结果.
任何信息,将不胜感激.
我最近将一个小项目更新为Java 8.该项目使用spring-data-mongodb.我将所有spring依赖版本升级到最新的稳定版本.spring-data-mongodb正在运行1.5.2.RELEASE.
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId>
<version>1.5.2.RELEASE</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
每当我启动服务时,我都会获得java.lang.Object的MappingException.
这是堆栈跟踪:
15:21:51.177 [main] ERROR o.s.web.servlet.DispatcherServlet - Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'pageableIdsRepository': Invocation of init method failed; nested exception is org.springframework.data.mapping.model.MappingException: Could not lookup mapping metadata for domain class java.lang.Object!
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1553) ~[spring-beans-4.0.6.RELEASE.jar:4.0.6.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:539) ~[spring-beans-4.0.6.RELEASE.jar:4.0.6.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475) ~[spring-beans-4.0.6.RELEASE.jar:4.0.6.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302) ~[spring-beans-4.0.6.RELEASE.jar:4.0.6.RELEASE]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228) ~[spring-beans-4.0.6.RELEASE.jar:4.0.6.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298) ~[spring-beans-4.0.6.RELEASE.jar:4.0.6.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193) ~[spring-beans-4.0.6.RELEASE.jar:4.0.6.RELEASE]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:684) ~[spring-beans-4.0.6.RELEASE.jar:4.0.6.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760) ~[spring-context-4.0.6.RELEASE.jar:4.0.6.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482) ~[spring-context-4.0.6.RELEASE.jar:4.0.6.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:658) …Run Code Online (Sandbox Code Playgroud) 我的应用程序中有具有此注释结构的表,并且我使用JpaRepositoryCRUD 操作。
@Entity\n@Table(name = "FOO")\npublic class Foo implements Serializable {\n \xe2\x80\xa6\n}\nRun Code Online (Sandbox Code Playgroud)\n\n但我只需要覆盖表名(而不是任何等@Column属性)orm.xml,而不更改实际代码。我已经搜索过,但找不到在 Spring Data JPA 中执行此操作的方法。我在这里遗漏了什么或者不支持它吗?
我正在使用Spring Data REST。我正在尝试从实体(项目)取消绑定关联。即-该项目的属性是List类型。我要从中删除所有项目List。
为此,我使用DELETE方法:
curl -X DELETE …/categories/54ea0bcf27a2fb1b4641083a/fixedParentCategories
Run Code Online (Sandbox Code Playgroud)
这给我一个405 Method not allowed错误代码。但是,它适用于单值关联(当它不是List类型时)。该文档明确列出DELETE了受支持的关联方法。我想知道是否有解决办法。另外,我尝试将PUT(Content-Type:text / uri-list)与一个空的正文一起使用,它给出了有关缺少请求正文的错误。此关联上的其他操作都可以正常工作-我可以向该集合中添加项目,等等。
我的实体看起来像这样:
@Document
public class Category {
@DBRef(lazy = true)
private List<Category> fixedParentCategories;
…
}
Run Code Online (Sandbox Code Playgroud) spring-data ×7
jpa ×5
java ×3
spring ×3
hibernate ×2
java-8 ×1
mongo-java ×1
mongodb ×1
rest ×1
spring-boot ×1
sql ×1