1

私は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 で再び永続化されます

4

2 に答える 2

1

そうです、ユーザーパラメータが新しい(永続化されたことがない)場合、このメソッドはpersist()それを行います。デタッチされたインスタンス(すでに永続化されており、IDを持っている)の場合は、を呼び出して更新しmerge()ます。

メソッドの名前は誤解を招くと思います。むしろ、と呼ばれるべきsaveOrUpdate()です。

于 2013-02-22T13:39:27.123 に答える
0

メソッドパラメータUserが永続化されたエンティティである場合、getId()はnullにはなりません。

于 2013-02-22T13:42:14.070 に答える