小编beg*_*er_的帖子

Spring Data:覆盖保存方法

我正在考虑项目的弹簧数据.是否可以覆盖每个默认生成的保存方法?如果是,怎么样?

java spring-data

36
推荐指数
8
解决办法
4万
查看次数

错误"ValueError:无法在此早期格式化日期"在一台PC上运行,其他工作正常

我有一个Python脚本,可以在我的开发PC上完美运行.两者都是具有相同Python版本(2.7.9)的Windows 7.但是在目标机器上我得到了一个

ValueError:无法提前格式化日期

错误似乎来自pywin32模块.

该代码使用pywin32调用的第三方库:

raw = win32com.client.Dispatch("MyLib.MyClass")
Run Code Online (Sandbox Code Playgroud)

然后在以后失败:

acq_time = raw.GetCreationDate()
Run Code Online (Sandbox Code Playgroud)

现在我迷失了为什么这在我的电脑上而不是在目标机器上工作.两者都具有Windows 7的"公司安装",例如,相同的区域和日期时间设置.

有什么问题?我该如何解决?

编辑:

看评论.原因可能是使用了哪个C++运行时.我还在调查.我现在怀疑在pywin32的安装时间存在哪些运行时很重要.为什么?因为我的开发PC上的DependenyWalker说MSVCR90.DLL我的Lotus Notes安装依赖于pywin .这告诉我它肯定不是"硬"链接.

2015年6月30日更新:

我错了......这个问题现在也发生在我的电脑上.

一些进一步的信息 该脚本读取数据文件并将读取的元数据插入数据库.只有较旧的文件似乎受到了bug的影响,而不是新的(我现在认为这是假设是错误的).因此我的想法是在我的Dev PC上初始加载,然后希望新文件再也不会出现问题.

如果PC是脚本将运行,它读取的文件是在Windows共享驱动器(映射的网络驱动器)上.我没有访问该驱动器所以我只是将文件复制到我的电脑中.现在,为了进行初始加载,我请求访问所述网络驱动器和BOOM.它也不适用于我的Dev.从共享驱动器读取时的机器.

同一文件并不总是会出现此问题.我现在认为它与特定文件无关.我也尝试在64位PC上使用64位python.在那里花了更长时间才发生错误.事实上,一个文件被成功读取,但在我的电脑上失败了.我现在认为这是某种记忆问题?我相信它总是在日期行上失败,因为所有其他行只返回null或空字符串,这不会导致任何问题,并且完全有可能这样的值可以为null.但是对于日期来说这是一个问题,它不应该为null,然后抛出错误.

编辑更新:

在我的电脑上,它总是在同一个文件上失败.单独加载该文件非常合适.我现在认为这是一种计数器/数字溢出,在读取n个文件之后,会出现问题.它与我每次运行脚本而不是文件本身加载的文件数量有关.单独加载时失败的文件.

python datetime pywin32

36
推荐指数
1
解决办法
1359
查看次数

Spring-Data JPA:保存引用现有实体的新实体

问题基本上与下面的问题相同:

JPA级联持久化并且对分离实体的引用会抛出PersistentObjectException.为什么?

我正在创建一个引用现有的独立实体的新实体.现在,当我在Spring数据存储库中保存此实体时,会抛出异常:

org.springframework.dao.InvalidDataAccessApiUsageException: detached entity passed to persist
Run Code Online (Sandbox Code Playgroud)

如果我们看一下spring数据JPA的源代码中的save()方法,我们看到:

public <S extends T> S save(S entity) {

    if (entityInformation.isNew(entity)) {
        em.persist(entity);
        return entity;
    } else {
        return em.merge(entity);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我们看看isNew()in AbstractEntityInformation

public boolean isNew(T entity) {

    return getId(entity) == null;
}
Run Code Online (Sandbox Code Playgroud)

所以基本上如果我保存()一个新实体(id == null),spring数据将始终调用persist,因此这种情况总是会失败.

在向集合添加新项目时,这似乎是一个非常典型的用例.

我该如何解决这个问题?

编辑1:

注意:

此问题与如何保存引用Spring JPA中现有实体的新实体没有直接关系.详细说明假设您获得了通过http创建新实体的请求.然后,您从请求中提取信息,并创建您的实体和现有的实体.因此,他们将永远脱离.

java merge persist spring-data spring-data-jpa

31
推荐指数
2
解决办法
4万
查看次数

Spring MVC 3:将Spring-Data页面作为JSON返回

我有一个用Spring-Data制作的数据访问层.我现在正在创建一个Web应用程序.这个控制器方法应返回格式为JSON 的Spring-Data页面.

这样的页面是一个列表,其中包含额外的分页信息,例如记录总数等等.

这是可能的,如果是的话怎么样?

与此直接相关,我可以定义属性名称的映射吗?例如.意思是我需要定义如何在JSON中命名分页信息属性(与页面不同).这可能吗?怎么样?

java json spring-mvc spring-data spring-hateoas

25
推荐指数
2
解决办法
2万
查看次数

Spring Data:服务层单元测试

在我的项目中,我在进行单元测试时遇到了麻烦.一个问题是,只进行集成测试要快得多,并且还要测试组件实际上是否一起工作.单元测试新颖的"算法"左右似乎要容易得多.单元测试服务类它只是感觉错误和无用.

我正在使用mockito来模拟spring数据存储库(因此也就是DB访问).问题是如果我告诉模拟的存储库在方法调用getById上返回实体A,它显然会返回它,服务也将返回它.是的,该服务会做一些额外的东西,但是非常小的东西,比如加载延迟集合(来自hibernate).显然我在单元测试中没有任何惰性集合(代理).

例:

@Test
public void testGetById() {
    System.out.println("getById");
    TestCompound expResult = new TestCompound(id, "Test Compound", "9999-99-9", null, null, null);

    TestCompoundRepository mockedRepository = mock(TestCompoundRepository.class);
    when(mockedRepository.findOne(id)).thenReturn(expResult);

    ReflectionTestUtils.setField(testCompoundService, "testCompoundRepository",
            mockedRepository, TestCompoundRepository.class);

    TestCompound result = testCompoundService.getById(id);
    assertEquals(expResult, result);
}
Run Code Online (Sandbox Code Playgroud)

万岁,其余的都成功了.多么惊喜!不是真的没有.

有人可以向我解释我做错了什么吗?或者这样一个测试的重点是什么?我的意思是我告诉返回expResult然后它返回.哇.多么惊喜!感觉就像我在测试mockito是否有效,而不是我的服务.

编辑:

我看到的唯一好处是,如果有些是愚蠢的错误,就像在那里留下一个不需要的行,将返回值设置为null或类似的愚蠢.这种情况将由单元测试捕获."奖励 - 努力"比例看起来还不错吗?

java spring unit-testing spring-data

24
推荐指数
2
解决办法
3万
查看次数

如何将弹簧数据Sort转换为querydsl OrderSpecifier?

这基本上与此相反: 如何使用Spring JPA进行分页QueryDSL查询?

这是一个自定义查询,我不能使用任何findAll()方法.

编辑:

发布了错误的链接.现在纠正了.

querydsl spring-data

12
推荐指数
3
解决办法
2万
查看次数

Spring Data JPA和spring-security:在数据库级别上过滤(特别是对于分页)

我正在尝试使用注释和spring-security为我的开源项目添加方法级安全性.我现在面临的问题是找到所有方法,特别是用于分页的方法(例如,返回页面).

使用@PostFilter可以在列表中使用(但我个人认为在应用程序而不是数据库中进行过滤不是一个好主意)但是在分页查询中完全失败.

这是有问题的,因为我有一个Entity包含List<Compound>.复合有不同的实现,用户可能只有权读取其中一个化合物.Compound使用TABLE_PER_CLASS继承.存储库实现QueryDslPredicateExecutor.

我的想法是为每个查询添加一个谓词,根据当前用户限制返回结果.然而,我有点迷失在a)用户和角色的数据模型应该如何看,以及b)如何创建谓词(一旦定义了模型,这可能很容易).或者querydsl是否已经提供基于类型的过滤(在查询类中包含的元素)?

spring-security querydsl spring-data

11
推荐指数
2
解决办法
5459
查看次数

Java:如何覆盖这种通用方法?

public <S extends T> List<S> save(Iterable<S> entities) {
        //...
}
Run Code Online (Sandbox Code Playgroud)

如果我使用以下方法来覆盖

@Override
public List<MyType> save(Iterable<MyType> structures) {
    List<MyType> result = new ArrayList<>();
    //...
    return result;
}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

method does not override or implement a method from a supertype

name clash: save(Iterable<MyType>) in MyTypeRepositoryImpl and <S>save(Iterable<S>) in SimpleJpaRepository have the same erasure, yet neither overrides the other
  where S,T are type-variables:
    S extends T declared in method <S>save(Iterable<S>)
    T extends Object declared in class SimpleJpaRepository
Run Code Online (Sandbox Code Playgroud)

我怎么解决这个问题?我不需要该方法是通用的,事实上它不应该是.我的意思是

@Override
public <S extends MyType> …
Run Code Online (Sandbox Code Playgroud)

java generics overriding type-erasure

10
推荐指数
2
解决办法
1万
查看次数

大量提高插入性能

在我的应用程序中,我需要大量提高插入性能.示例:具有大约21K记录的文件需要超过100分钟才能插入.有理由可能需要一些时间,比如20分钟左右,但超过100分钟就太长了.

数据被插入3个表(多对多).Id是从序列生成的,但我已经用Google搜索并设置hibernate.id.new_generator_mappings = true并将allocationSize + sequence增量设置为1000.

此外,数据量根本不是特别的,文件是90 MB.

我已经用visual vm验证了大部分时间花在jdbc驱动程序(postgresql)和hibernate上.我认为该问题与子表中的唯一约束有关.服务层在插入之前进行手动检查(= SELECT).如果记录已存在,则重用它而不是等待约束异常.

因此,对于特定文件的总结,每个表将有1个插入(可能不同但不适用于此文件,这是理想(最快)的情况).这意味着总共60k插入+ 20k选择.仍然超过100分钟似乎很长(是的硬件计数,它是在一个简单的PC驱动器7200转,没有ssd或raid).然而,这是对先前应用程序(普通jdbc)的改进版本,在该应用程序上,此硬件上的相同插入大约需要15分钟.考虑到在两种情况下花费大约4-5分钟用于"预处理",增加是巨大的.

有什么提示可以改进吗?有没有批量加载功能?

bulkinsert spring-data-jpa

9
推荐指数
1
解决办法
1万
查看次数

Python日志记录:为所用模块的所有记录器设置处理程序

我有我的主脚本用argparse解释cli命令,然后通过从另一个模块(由我自己制作)调用相应的东西来启动应用程序.

我现在的问题是如何将处理程序从该模块附加到记录器.使用检索记录器

logger = logging.getLogger(__name__)
Run Code Online (Sandbox Code Playgroud)

因此我在主脚本中加入了以下内容:

consoleHandler = logging.StreamHandler()
logger = logging.getLogger('MyModule')
logger.addHandler(consoleHandler)
Run Code Online (Sandbox Code Playgroud)

但是'MyModule'有0个日志输出.日志级别是正确的,例如应该有输出.

MyModule我有以下几点:

logging.getLogger(__name__).addHandler(logging.NullHandler())
Run Code Online (Sandbox Code Playgroud)

但是删除它没有任何区别.

那么我怎样才能正确地将处理程序附加到记录器MyModule

python logging

8
推荐指数
1
解决办法
1万
查看次数