合并操作无异常但对数据库无影响 Glassfish 4.1 JPA

Merge operation without exception but with no impact on the database Glassfish 4.1 JPA

我得到一个带有字符串字段的 table 并尝试更新此字段并通过 EntityManager 将更新合并到数据库。这已经完成并且没有异常,但我认为对数据库没有影响并且 运行 不知道那里有什么。希望有人有想法。在下面的示例 match != null 和两个打印语句中,我将预期值写入我的日志。但是 t运行saction 中的合并对数据库没有影响,即使提交已终止。

@Named
@SessionScoped
@ManagedBean
public class LoginController implements Serializable {

    @PersistenceUnit
    private EntityManagerFactory emf;

    public String mymethod(){
        ...
        match.setPwdResetId(rs);
        System.out.println("reset it is now "+match.getPwdResetId());
        try{
            ut.begin();
            emf.createEntityManager().merge(match);
            ut.commit();
        }
        catch(Exception e){
            FacesMessage m2 = new FacesMessage("Values could not be saved. ");
            FacesContext.getCurrentInstance().addMessage("ResetForm", m2);
            System.out.println("exceptio persisting "+e);
            return "message.jsf";
        }  
        System.out.println("reset it is now2 "+match.getPwdResetId());

请分离实体并重试。 您可以在 jpa 2 规范中阅读更多内容。我 post 合并操作的示例:

The semantics of the merge operation applied to an entity X are as follows:

  • If X is a detached entity, the state of X is copied onto a pre-existing managed entity instance X' of the same identity or a new managed copy X' of X is created.

  • If X is a new entity instance, a new managed entity instance X' is created and the state of X is copied into the new managed entity
    instance X'.

  • If X is a removed entity instance, an IllegalArgumentException will be thrown by the merge operation (or the transaction commit will
    fail).

  • If X is a managed entity, it is ignored by the merge operation, however, the merge operation is cascaded to entities referenced by
    relationships from X if these relationships have been annotated with
    the cascade element value cascade=MERGE or cascade=ALL annotation.

  • For all entities Y referenced by relationships from X having the cascade element value cascade=MERGE or cascade=ALL, Y is merged
    recursively as Y'. For all such Y referenced by X, X' is set to
    reference Y'. (Note that if X is managed then X is the same object as X'.)

  • If X is an entity merged to X', with a reference to another entity Y, where cascade=MERGE or cascade=ALL is not specified, then
    navigation of the same association from X' yields a reference to a
    managed object Y' with the same persistent identity as Y.

The persistence provider must not merge fields marked LAZY that have not been fetched: it must ignore such fields when merging. Any Version columns used by the entity must be checked by the persistence runtime implementation during the merge operation and/or at flush or commit time. In the absence of Version columns there is no additional version checking done by the persistence provider runtime during the merge operation.

你可以找到完整的 pdf here