0

以下の @ManyToMany 関係を含む 2 つのテーブル (ユーザーとプロファイル) があります。

プロファイル クラス:

@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
4

0 に答える 0