EJB / JPA:如何使用EntityManager.persist()始终插入新记录,而不是更新

时间:2012-06-12 11:15:27

标签: java jpa ejb

EntityManager.persist()函数正在尝试更新现有记录,但我总是需要插入一个新记录。怎么做到这一点?

实体bean的一部分:

@Entity
@Table(name="SYNC_TRIGGER", schema="ETL")
public class SyncTrigger implements Serializable {

    @Id
    @Column(name="ID")
    @SequenceGenerator(name = "TRIGGER_SEQ", sequenceName = "ETL.TRIGGER_SEQ")
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "TRIGGER_SEQ")
    private Long triggerId;
......

无状态bean的一部分,它保留了记录:

@Stateless
public class TriggerPersister {

    @PersistenceContext(unitName="syncTriggerDS") 
    protected EntityManager entityManager;

    public <T extends GenericTrigger> void persistTrigger(SyncTrigger 
            st, T concreteTrigger){

            entityManager.persist(st);
.........

UPD: 在执行entityManager.persist(st)之前,st.triggerId的值为null,但是之后添加的记录的id被分配给该字段。

1 个答案:

答案 0 :(得分:3)

EntityManager.persist()总是尝试创建一个新的托管对象。如果您在已经管理的实体上调用它,它会抛出EntityExistsException

您必须使用merge()进行更新。

请参阅两种方法的javadoc。