我有一个JPA注释类,其中包含如下集合:
@Entity
public class Employee {
@Id
private int id;
@Basic
private String name;
@OneToMany
@JoinTable(name = "ORG", joinColumns = @JoinColumn(name="MINION"),
inverseJoinColumns = @JoinColumn(name="EMP"))
private List<Employee> minions = new ArrayList<Employee>();
@PreUpdate
public void preUpdate(){ ... }
}
Run Code Online (Sandbox Code Playgroud)
我所看到的是,如果我有一个托管的Employee实体,并且我添加了它的minions集合,preUpdate则不会调用该方法.在DB中的映射表中添加了一个新行,因此我知道更新正在进行中.如果我直接在Employee上更改属性(如name),则会preUpdate在提交事务时按预期触发.
有没有办法在修改映射集合时触发PreUpdate?或者是否有其他技术或Hibernate特定注释用于检测何时发生?
我正在使用Spring事务测试类来对我的DAO代码进行单元测试.我想要做的是在所有测试运行之前创建一次我的数据库.我有一个@BeforeClass注释方法,但是在Spring加载应用程序上下文并配置jdbcTemplate之前运行,因此我当时实际上并没有连接到DB.有没有办法在上下文加载后但在测试开始运行之前运行我的数据库设置?
这个问题同样问题,但接受的解决方案似乎只是"不要那样做".我倾向于说这似乎是不可行的.
我有一个大型应用程序分布在多个Spring bean定义xml文件中.在我的测试套件中,我使用FileSystemXmlApplicationContext手动加载我需要的XML文件,以执行我想要运行的测试.这减少了测试设置时间,并允许我使用生产中使用的完全相同的配置文件.
现在我正在尝试使用Spring的事务测试基类,它接受配置位置并为我加载上下文.出于某种原因,当创建应用程序上下文时,Spring无法找到任何配置文件.这很令人困惑,因为我从同一个工作目录运行测试,就像我自己使用FileSystemXmlApplicationContext加载配置一样.如果我在所有配置位置前加上"file:",则会找到我在测试中指定的路径,但找不到配置中定义的bean(例如属性文件)导入或引用的任何文件.这是怎么回事?我是否可以获得扩展spring上下文测试类的测试与我自己创建上下文的测试相同?
例如,创建像这样的上下文工作正常:
ApplicationContext ctx = new FileSystemXmlApplicationContext(new String[] { "WEB-INF/services-context.xml"})
Run Code Online (Sandbox Code Playgroud)
如果我扩展AbstractTransactionalDataSourceSpringContextTests,则以下找不到services-context.xml:
@Override
protected String[] getConfigLocations() {
return new String[] { "WEB-INF/services-context.xml"};
}
Run Code Online (Sandbox Code Playgroud)
这找到了services-context,但是在那里定义的PropertyPlaceholderConfigurer无法找到它的属性文件.
@Override
protected String[] getConfigLocations() {
return new String[] { "file:WEB-INF/services-context.xml"};
}
Run Code Online (Sandbox Code Playgroud) 我试图弄清楚我必须如何构建查询,以便它们将达到我的索引.我的文档结构如下:
{ "attributes" : { "make" : "Subaru", "color" : "Red" } }
Run Code Online (Sandbox Code Playgroud)
索引为: db.stuff.ensureIndex({"attributes.make":1})
我发现使用点表示法查询命中索引,而查询文档却没有.
例:
db.stuff.find({"attributes.make":"Subaru"}).explain()
{
"cursor" : "BtreeCursor attributes.make_1",
"nscanned" : 2,
"nscannedObjects" : 2,
"n" : 2,
"millis" : 0,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {
"attributes.make" : [
[
"Subaru",
"Subaru"
]
]
}
}
Run Code Online (Sandbox Code Playgroud)
VS
db.stuff.find({attributes:{make:"Subaru"}}).explain()
{
"cursor" : "BasicCursor",
"nscanned" : 2,
"nscannedObjects" : 2,
"n" : 0,
"millis" : 1,
"nYields" : …Run Code Online (Sandbox Code Playgroud) 这更像是一个正确性问题.假设我的数据库中有一个包含主键列的表.在我的DAO代码中,我有一个名为insertRow(string key)的函数,如果表中不存在该键并且使用该键插入一个新行,则该函数将返回true.否则,如果该键已经存在,则返回false.让insertRow首先检查密钥是否存在更好/更糟或只是继续执行插入并捕获重复密钥错误?或者在单个选择语句中保存太微不足道的优化甚至令人担心?
所以在sudo代码中:
boolean insertRow(String key){
//potentially a select + insert
if(select count(*) from mytable where key = "somekey" == 0){
insert into mytable values("somekey")
return true;
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
要么
boolean insertRow(String key){
try{
//always just 1 insert
insert into mytable values("somekey")
return true;
} catch (DuplicateKeyException ex){}
return false;
}
Run Code Online (Sandbox Code Playgroud)