2012-02-27 27 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

相关问题