Java 是否保留实体,除非它们已经存在?

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'

考虑以下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');
在事务内部,我希望实现以下目标:如果不存在其他名为
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
中进行包装。