在Hibernate中删除对象列表的正确方法是什么?

时间:2017-03-31 10:15:27

标签: java hibernate

我有一个对象User,它有一个UserDictionary列表。每个UserDictionary都有一个带有级联删除的UserWords列表。

User.java

public class User implements Serializable
{

    private Long id;
    private String login;
    private String password;
    private String email;
    private Boolean isVerified;
    private List<UserDictionary> dictionaries = new ArrayList<>();
    private UserTrainingSettings settings;

    //getters and setters there
}

并映射User.hbm.xml

<hibernate-mapping>
<class name="User" dynamic-insert="true" dynamic-update="true" table="USER" entity-name="user">
    <id name="id" type="java.lang.Long" column="user_id">
        <generator class="native"/>
    </id>
    <property name="login" type="java.lang.String" length="40" not-null="true" unique="true"/>
    <property name="password" type="java.lang.String" length="32" not-null="true"/>
    <property name="email" type="java.lang.String" length="100" not-null="true"/>
    <property name="isVerified" type="java.lang.Boolean" column="verified" not-null="true"/>
    <list name="dictionaries" fetch="join">
        <key column="user_id" not-null="true" on-delete="cascade"/>
        <one-to-many class="com.github.wordsmemoriser.Model.UserDictionary"/>
    </list>
    <one-to-one name="settings" class="com.github.wordsmemoriser.Model.UserTrainingSettings"
                cascade="javax.persistence.CascadeType.REMOVE"/>
</class>
</hibernate-mapping>

UserDictionary.java

public class UserDictionary
{
    private Long id;
    private User user;
    private String name;
    private List<UserWords> words = new ArrayList<>();
    //getters and setters there
}

并映射UserDictionary.hbm.xml

<hibernate-mapping>
<class name="UserDictionary" dynamic-insert="true" dynamic-update="true" table="DICTIONARY">
    <id name="id" type="java.lang.Long" column="dict_id">
        <generator class="native"/>
    </id>
    <many-to-one name="user" class="com.github.wordsmemoriser.Model.User" fetch="join">
        <column name="user_id" not-null="true"/>
    </many-to-one>
    <property name="name" type="java.lang.String" length="100"/>
    <list name="words">
        <key column="dict_id" not-null="true" on-delete="cascade"/>
        <one-to-many class="com.github.wordsmemoriser.Model.UserWords"/>
    </list>
</class>
</hibernate-mapping>

从用户删除所有UserDictionaries的正确方法是什么?我是否应该迭代此列表,从数据库中删除每个UserDictionary,然后清除此列表并像这样更新用户

session.beginTransaction();
for(UserDictionary dict : user.getDictionaries())
{
    session.delete(dict);
}
user.getDictionaries().clear();
session.update(user);
session.getTransaction().commit();

或者我应该清除用户列表,然后像这样更新

user.getDictionaries().clear();
session.beginTransaction();
session.update(user);
session.getTransaction().commit();

0 个答案:

没有答案