我是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
保留用户答案 0 :(得分:1)
你是对的,如果用户参数是新的(从未被持久化),那么这个方法将persist()
。如果它是一个分离的实例(已经被持久化并且有一个id),它将通过调用merge()
来更新它。
我认为该方法的名称具有误导性,应该称为saveOrUpdate()
。
答案 1 :(得分:0)
如果方法参数User是持久化实体,那么getId()将不为null。