Java 是否保留实体,除非它们已经存在?
考虑以下JPA实体:Java 是否保留实体,除非它们已经存在?,java,jpa,datanucleus,Java,Jpa,Datanucleus,考虑以下JPA实体: @Entity class Entity { @Id private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } } Entity entity = new Entity(); entity.setName('foo'
@Entity
class Entity {
@Id
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Entity entity = new Entity();
entity.setName('foo');
在事务内部,我希望实现以下目标:如果不存在其他名为foo
的实体,则将该实体entity
持久化到数据存储,或者如果已经存在名为foo
的entity
类型的实体,则抛出异常
实现这一点最惯用/最好的方法是什么?(值得一提的是,我将DataNucleus的JPA实现与App Engine一起使用。)每当您创建一个显式指定密钥的新实体时,必须检查数据存储中是否已经存在具有相同密钥的实体 创建如下方法:
public Entity getEntityByName(String name) {
// First try to load from datastore
// If exists, return that
// If doesn't exist, return a new instance
}
当你想使用一个
Enity
时,通过这个方法获取它。如果你试图用相同的名字保存第二个实体,你会不会已经得到一个例外,因为这个名字就是PK?实际上这就是我所希望的。但是,我可以通过调用persist
来覆盖现有实体。GAE/Datastore在数据存储中没有此类约束,因此您可以覆盖现有记录。不是RDBMS@BillyFrost:出于好奇,它会/应该与完全兼容的JPA提供程序/后端一起工作,还是需要进一步的注释?GAE/数据存储没有“完全兼容的JPA提供程序”,但JPA的想法是它应该抛出异常。我知道谷歌在完成这项工作上没有付出足够的努力。请记住,web应用程序是在并发执行环境(AppServer)中运行的。您需要将此方法封装在一个单例中,否则另一个线程(另一个请求)可以在您检查实例是否存在后创建并持久化实例,但在持久化之前。我将在Guice的@transactional
中进行包装。