[英]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.