2012-02-27 28 views
1

你好,stackoverflow社區。Apache OpenJPA - 僅當數據庫中不存在時才插入元組

我想知道,如果OpenJPA有可能首先檢查對象在插入前是否已經存在於數據庫中。

我有兩個clases:

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

+0

JPA會清楚地檢查JPA規範中的內容。如果傳遞給持久化/合併的對象處於分離/管理狀態,則會更新它,否則會創建它。 – DataNucleus 2012-02-28 08:04:33

+0

我認爲這裏的問題是,我從來不想更新現有的元組。 – veote 2012-02-28 10:22:45

+0

所以你必須檢查存在。 JPA不會爲你做。 – DataNucleus 2012-02-28 10:25:51

回答

0
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

嘿, 這是我現在做的。我首先檢查是否有一個與我的對象具有相同屬性的實體(如果沒有ID)如果是 - >將此實體,如果不堅持我的對象 – veote 2012-02-29 07:20:39

相關問題