Apache OpenJPA - вставка кортежа, только если его нет в базе данных - PullRequest
1 голос
/ 27 февраля 2012

Привет сообщество stackoverflow.

Я хочу знать, есть ли в OpenJPA возможность сначала проверить, существует ли объект в БД перед вставкой.

У меня есть два предложения:

imports...

@Entity(name="Player")
public class Player {
    private long id;
    private String nickName;
    private Team team; /* A Player is on a Team */

    @ManyToOne(cascade=CascadeType.PERSIST)
    @JoinColumn(name = "team_id")
    public Team getTeam() {
        return team;
    }

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    public long getId() {
        return id;
    }

    /* more getters / setters ...*/
}
@Entity(name="Team")
public class Team {
    private long id;
    private String name;
    private List<Player> players; /* A Team Has Players */

    @OneToMany(mappedBy = "team", targetEntity = Player.class, 
            fetch = FetchType.EAGER, cascade = CascadeType.PERSIST)
    public List<Player> getPlayers() {
        return players;
    }

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    public long getId() {
        return id;
    }

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

Возможно ли это? Или мне нужно написать собственный метод?

С наилучшими пожеланиями Veote

Ответы [ 3 ]

1 голос
/ 24 декабря 2012

Вы можете проверить этот переключатель: http://openjpa.apache.org/builds/2.2.0/apache-openjpa/docs/jpa_2.2.html#jpa_2.2_cascadePersist

Полагаю, вы используете OpenJPA 2.2.0.

0 голосов
/ 28 февраля 2012
public interface EntityManager {
/**
* Make an instance managed and persistent.
* @param entity
* @throws EntityExistsException if the entity already exists.
* (If the entity already exists, the EntityExistsException may
* be thrown when the persist operation is invoked, or the
* EntityExistsException or another PersistenceException may be
* thrown at flush or commit time.)
* @throws IllegalArgumentException if the instance is not an
* entity
* @throws TransactionRequiredException if invoked on a
* container-managed entity manager of type
* PersistenceContextType.TRANSACTION and there is
* no transaction
*/
public void persist(Object entity);
    . . . 
}

Если вы вызываете EntityManager.persist (...) и передаете экземпляр Player, который уже существует в БД, JPA (согласно спецификации) сгенерирует исключение EntityExistsException.Я бы порекомендовал прочитать EntityManager javadoc , чтобы лучше понять, что можно сделать с помощью API.Кроме того, я бы рекомендовал добавить поле @Version к вашим сущностям.

0 голосов
/ 27 февраля 2012

Да, я думаю, что вы можете ... http://openjpa.apache.org/builds/1.2.2/apache-openjpa-1.2.2/docs/manual/manual.html#ref_guide_integration_revmappingtool перейти на этот сайт для более подробной информации ..

...