4

私はStruts2 + Hibernateを使用しており、ネット上の例で理解しています。ここの例の 1 つで、struts2+hibernate の例

私が見てできることは、ユーザーを によって削除することです。idそこにあるように、リスト内の各ユーザーに削除リンクが提供され、session.delete()によってレコードが削除されidます。ここで、ユーザーにそこにあるテキスト フィールドに名前を入力してもらい、名前で削除できるようにします。これまでのところ、私はこのように試しました

アクション方法:

public String delete()
{
    //HttpServletRequest request = (HttpServletRequest) ActionContext.getContext().get( ServletActionContext.HTTP_REQUEST);
    //userDAO.delUser(Long.parseLong( request.getParameter("id")));
            userDAO.delUser(user.getName());
    return SUCCESS;
}

DAOImpl:

@Override
public void delUser(String userName) {
    try {
        User user = (User) session.get(User.class, userName);
        session.delete(user);
    } catch (Exception e) {
        transaction.rollback();
        e.printStackTrace();
    } 
}

提供された任意のフィールド値によって Hibernate が行を削除できる方法があることを願っています。上記は何もしません。

4

4 に答える 4

6

単純にJPQL削除クエリを使用してみませんか?これは、DBからオブジェクトを復元して単純に削除するために休止状態を必要としません。最初にDBからユーザーをロードせずに、名前でユーザーを削除する方法は次のとおりです。

    Query query = em.createQuery("delete from User where name=:name");
    query.setParameter("name", "Zigi");
    int deleted = query.executeUpdate();
    System.out.println("Deleted: " + deleted + " user(s)");
于 2013-03-20T21:06:21.920 に答える
5

Hibernate で発生する問題は、一部のプロパティ値によって永続化インスタンスを取得できず、 によってのみ取得できますiduserNameこれを試してインスタンスを見つけたい場合

public static final String USER_NAME = "userName";

private List<User> findByProperty(String propertyName, Object value) {
    log.debug("finding User instance with property: " + propertyName    + ", value: " + value);
    try {
        String queryString = "from User as model where model." + propertyName   + "= ?";
        Query queryObject = getSession().createQuery(queryString);
        queryObject.setParameter(0, value);
        return queryObject.list();
    } catch (RuntimeException re) {
        log.error("find by property name failed", re);
        throw re;
    }
}

public List<User> findByUserName(Object userName) {
    return findByProperty(USER_NAME, userName);
}

@Override
public void deleteUsers(String userName) {
  try {
    List<User> list = findByUserName(userName);
    for (User user: list)
      getSession().delete(user);
    log.debug("delete successful");
  } catch (RuntimeException re) {
    log.error("delete failed", re);
    throw re;
  }
}  

指定された名前のすべてのユーザーを削除します。一意のユーザーを削除するには、user_nameフィールドに一意の制約があることを確認してください。テーブルの注釈を介して行うことができます

@Table(name = "user", uniqueConstraints = {
        @UniqueConstraint(columnNames = "user_name")
})
于 2013-03-21T10:26:26.287 に答える
1

によってユーザーを取得するには、クエリを作成する必要がありますuserName

例えば

String qStr = "from User user where user.userName = :userName";
//then run the query to get the user
Query q = session.createQuery(qStr);
q.setParameter("userName", userName);
List<User> users = (List<User>) q.list();
//if the list is not empty, then users.get(0) will give you the object
于 2013-03-20T20:28:08.700 に答える