簡體   English   中英

JPA如何調用合並或持久化

[英]JPA how to call merge or persist

我是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;
}

與實體:

@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;
}

}

我不完全了解。

在此行中:如果(user.getId()!= null)user.getId將始終為null,因為我相信ID將在對象持久化的同時生成? 這樣,就永遠不會從db中填充tempUser,並且該對象將始終保持不變並且不會合並..... 還是我看錯了?

查看您是否需要像這樣持久或合並的最佳方法是什么。

編輯

如果我使用這樣的主線怎么辦:

User user1 = new User();

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

... .add(user1);

如果我運行一次,則添加用戶。 如果我隨后再次運行此用戶,則該用戶再次以id + 1保留

是的,如果用戶參數是新的(從未被持久化),則此方法將對它進行persist() 如果它是一個分離的實例(已經被持久化並具有一個ID),它將通過調用merge()對其進行更新。

我認為該方法的名稱具有誤導性,應將其稱為saveOrUpdate()

如果方法參數User是持久實體,則getId()將不為null。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM