JPA如何调用merge或persist

时间:2013-02-22 13:33:37

标签: java jpa

我是JPA的新手,我遇到了来自存储库的示例代码的问题:

@Override
public boolean add(User user) {
    EntityManagerFactory emf = HibernateRepositoryFactory
            .getEntityManagerFactory();
    EntityManager em = emf.createEntityManager();
    EntityTransaction tx = em.getTransaction();
    tx.begin();

    User tempUser = null;
    try {
        if (user.getId() != null) {
            tempUser = em.find(User.class, user.getId());
        }
        if (tempUser == null) {
            em.persist(user);
        } else {
            // if so, get the differences and persist them
            tempUser.setPassword(user.getPassword());
            tempUser.setUserName(user.getUserName());
            tempUser = em.merge(user);
        }
    } catch (Exception e) {
        logging.error("log error+ " :" + e);
    }
    tx.commit();
    em.close();
    emf.close();
    return true;
}

with entity:

@Entity
@Table(name = "USERS")

public class User implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "ID", nullable = false, unique = true)
private Long id;

@Version
@Column(name = "OPTLOCK")
private int version;

@Column(name = "USERNAME", nullable = false)
private String userName;

@Column(name = "PASSWORD", nullable = false)
private String password;

public User() {
    super();
}

public String getUserName() {
    return userName;
}

public void setUserName(String userName) {
    this.userName = userName;
}

public String getPassword() {
    return password;
}

public void setPassword(String password) {
    this.password = password;
}

public Long getId() {
    return id;
}

public int getVersion() {
    return version;
}

}

我完全不理解它。

在行中:if(user.getId()!= null)user.getId将始终为null,因为我相信在对象将被持久化时将生成id?像这样,tempUser将永远不会从db中填充,并且对象将始终保持不被合并....或者我看错了吗?

最好的方法是看你是否需要像这样坚持或合并。

修改

如果我会使用这样的主要内容:

User user1 = new User();

    user1 .setPassword("password_user1");
    user1 .setUserName("userName_user1");

... .add(user1);

如果我一次运行此用户,则添加用户。如果我再次运行此用户,则再次使用id + 1

保留用户

2 个答案:

答案 0 :(得分:1)

你是对的,如果用户参数是新的(从未被持久化),那么这个方法将persist()。如果它是一个分离的实例(已经被持久化并且有一个id),它将通过调用merge()来更新它。

我认为该方法的名称具有误导性,应该称为saveOrUpdate()

答案 1 :(得分:0)

如果方法参数User是持久化实体,那么getId()将不为null。