使用Hibernate持久化大型数据集时的LockAcquisitionException

时间:2013-08-05 11:28:41

标签: hibernate

我有2个表(用户和个人资料),其中包含@ManyToMany关系:

个人资料类:

@Cache (usage = CacheConcurrencyStrategy.TRANSACTIONAL)
@Entity
@Table(uniqueConstraints=@UniqueConstraint(columnNames={"name"}))
public class Profile implements Serializable {
    private static final long serialVersionUID = 1L;

    private Long m_id;
    private String m_name;
    private List<User> m_users= new ArrayList<User>();

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    public Long getId() {
        return m_id;
    }

    private void setId(Long id) {
        m_id = id;
    }

    public String getName() {
        return m_name;
    }

    public void setName(String name) {
        m_name = name;
    }

    @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}, 
                mappedBy="profiles")
    public List<User> getUsers() {
        return m_users;
    }

    public void setUsers(List<User> users) {
        m_users = users;
    }

用户类:

@Cache(usage = CacheConcurrencyStrategy.TRANSACTIONAL)
@Entity
public class User implements Serializable {
    private static final long serialVersionUID = 1L;
    private Long m_id;
    private String m_name;
    private List<Profile> m_profiles = new ArrayList<Profile>();

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    public Long getId() {
        return m_id;
    }

    private void setId(Long id) {
        m_id = id;
    }

    @NaturalId
    @Column(unique = true, nullable = false)
    public String getName() {
        return m_name;
    }

    @Cache (usage = CacheConcurrencyStrategy.TRANSACTIONAL)
    @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
    @JoinTable(name = "User_Profile", 
            joinColumns = { @JoinColumn(name = "user_id") }, 
            inverseJoinColumns = { @JoinColumn(name = "profiles_id") })
    public List<Profile> getProfiles() {
        return m_profiles;
    }
}

当我执行使用大型用户对象保存或更新数据,然后休眠会话无法正常工作时。

示例:

List<User> users = new ArrayList(); users.add(new User("test", ..));
users.add(new User());
// 3500x... new User()
Profile profile = new Profile(name, users);
getSession().saveOrUpdate(profile);

会话无效并抛出一些例外

Could not execute JDBC batch update; SQL [delete from User_Profile
  where user_id=?]; nested exception is
org.hibernate.exception.LockAcquisitionException: 
  Could not execute JDBC batch update

0 个答案:

没有答案