2014-09-17 4 views
1

Рассмотрит следующий 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 к хранилищу данным, если нет никакого другого объекта такого рода с именем foo существует, или выбросить исключение если уже существует предприятие вида Entity с именем foo.

Какой самый идиоматический/лучший способ достичь этого? (Для чего это стоит, я использую реализацию JPA DataNucleus' с App Engine.)

+2

Неужели вы уже получили исключение, если пытались сохранить вторую сущность с тем же именем, поскольку имя является PK? – Petter

+0

На самом деле это то, на что я надеялся. Однако я могу перезаписать существующий объект с вызовом 'persist'. – Marc

+1

GAE/Datastore не имеет таких ограничений в хранилище данных, поэтому вы можете перезаписать существующие записи. Не RDBMS –

ответ

2

Всякий раз, когда вы создаете новый объект, где вы явно указать ключ, вам нужно обязательно проверить, если объект с тем же ключом уже существует в хранилище данных.

Создать метод, как:

public Entity getEntityByName(String name) { 
    // First try to load from datastore 
    // If exists, return that 
    // If doesn't exist, return a new instance 
} 

И всякий раз, когда вы хотите работать с Enity, приобрести его с помощью этого метода.

+1

Плюс помните, что веб-приложение запускается одновременно с выполнением среды (сервера приложений). ** Вам нужно, чтобы этот метод был заключен в singleton **, иначе другой поток (другой запрос) может создавать и сохранять экземпляр после проверки наличия, но до его сохранения. – zbig

+0

Я бы обернулся в '@ transactional' Guice. – Marc

Смежные вопросы