私は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;
}
}
私はそれを完全に理解していません。
行内: if (user.getId() != null) user.getId は常に null になります。これは、オブジェクトが永続化される瞬間に ID が生成されると考えているためです。このように、tempUser はデータベースから入力されることはなく、オブジェクトは常に永続化され、マージされません .... . または、これは間違っていると思いますか?
このように永続化またはマージする必要があるかどうかを確認する最良の方法は何ですか。
編集
このようなメインを使用するとどうなりますか:
User user1 = new User();
user1 .setPassword("password_user1");
user1 .setUserName("userName_user1");
... .add(user1);
これを 1 回実行すると、ユーザーが追加されます。その後、これを再度実行すると、ユーザーは id+1 で再び永続化されます