I'm trying to get a ManyToMany mapping working with security database and am encountering a problem that I do not know how to resolve.
Here's my code:
Code:
@Entity
@Table(name = "sec_DBGroup")
public class DBGroup {
    private long id;
    @Column(name = "Id", nullable = false, insertable = true, updatable = true, length = 19, precision = 0)
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Id
    public long getId() {
        return id;
    }
    public void setId(long id) {
        this.id = id;
    }
    private String name;
    @Column(name = "Name", nullable = false, insertable = true, updatable = true, length = 128, precision = 0)
    @Basic
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    private String description;
    @Column(name = "Description", nullable = true, insertable = true, updatable = true, length = 128, precision = 0)
    @Basic
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        DBGroup dbgroup = (DBGroup) o;
        if (id != dbgroup.id) return false;
        if (name != null ? !name.equals(dbgroup.name) : dbgroup.name != null) return false;
        return true;
    }
    @Override
    public int hashCode() {
        int result = (int) (id ^ (id >>> 32));
        result = 31 * result + (name != null ? name.hashCode() : 0);
        return result;
    }
    private Collection<SecurityRole> roles;
    @ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(
            name = "sec_DBGroupRoleMap",
            joinColumns = @JoinColumn(name = "DBGroupId"),
            inverseJoinColumns = @JoinColumn(name = "SecurityRoleId")
    )
    @ForeignKey(name = "FK_DBGroupRoleMap_DBGroup", inverseName = "FK_DBGroupRoleMap_SecurityRole")
    @CollectionId(
            columns = @Column(name="Id"),
            type = @Type(type = "long"),
            generator = "native"
    )
    public Collection<SecurityRole> getRoles() {
        return roles;
    }
    public void setRoles(Collection<SecurityRole> roles) {
        this.roles = roles;
    }
    private Collection<SystemUser> users;
    @ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(
            name = "sec_UserDBGroupMap",
            joinColumns = @JoinColumn(name = "DBGroupId"),
            inverseJoinColumns = @JoinColumn(name = "SystemUserId")
    )
    @ForeignKey(name = "FK_UserDBGroupMap_DBGroup", inverseName = "FK_UserDBGroupMap_SystemUser")
    @CollectionId(
            columns = @Column(name="Id"),
            type = @Type(type = "long"),
            generator = "native"
    )
    public Collection<SystemUser> getUsers() {
        return users;
    }
    public void setUsers(Collection<SystemUser> users) {
        this.users = users;
    }
}
@Entity
@Table(name = "sec_DBGroupRoleMap")
public class DBGroupRoleMap {
    private long id;
    @Column(name = "Id", nullable = false, insertable = true, updatable = true, length = 19, precision = 0)
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Id
    public long getId() {
        return id;
    }
    public void setId(long id) {
        this.id = id;
    }
    private long dbgroupid;
    @Column(name = "DBGroupId", nullable = false, insertable = true, updatable = true, length = 19, precision = 0)
    @Basic
    public long getDbgroupid() {
        return dbgroupid;
    }
    public void setDbgroupid(long dbgroupid) {
        this.dbgroupid = dbgroupid;
    }
    private long securityroleid;
    @Column(name = "SecurityRoleId", nullable = false, insertable = true, updatable = true, length = 19, precision = 0)
    @Basic
    public long getSecurityroleid() {
        return securityroleid;
    }
    public void setSecurityroleid(long securityroleid) {
        this.securityroleid = securityroleid;
    }
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        DBGroupRoleMap that = (DBGroupRoleMap) o;
        if (dbgroupid != that.dbgroupid) return false;
        if (id != that.id) return false;
        if (securityroleid != that.securityroleid) return false;
        return true;
    }
    @Override
    public int hashCode() {
        int result = (int) (id ^ (id >>> 32));
        result = 31 * result + (int) (dbgroupid ^ (dbgroupid >>> 32));
        result = 31 * result + (int) (securityroleid ^ (securityroleid >>> 32));
        return result;
    }
}
@Entity
@Table(name = "sec_SecurityRole")
public class SecurityRole {
    @Expose
    private long id;
    @Column(name = "Id", nullable = false, insertable = true, updatable = true, length = 19, precision = 0)
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Id
    public long getId() {
        return id;
    }
    public void setId(long id) {
        this.id = id;
    }
    @Expose
    private String name;
    @Column(name = "Name", nullable = false, insertable = true, updatable = true, length = 128, precision = 0)
    @Basic
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    private String description;
    @Column(name = "Description", nullable = true, insertable = true, updatable = true, length = 128, precision = 0)
    @Basic
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        SecurityRole that = (SecurityRole) o;
        if (id != that.id) return false;
        if (description != null ? !description.equals(that.description) : that.description != null) return false;
        if (name != null ? !name.equals(that.name) : that.name != null) return false;
        return true;
    }
    @Override
    public int hashCode() {
        int result = (int) (id ^ (id >>> 32));
        result = 31 * result + (name != null ? name.hashCode() : 0);
        result = 31 * result + (description != null ? description.hashCode() : 0);
        return result;
    }
    private Collection<SecurityPermission> permissions;
    @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinTable(
            name = "sec_RolePermissionMap",
            joinColumns = @JoinColumn(name = "SecurityRoleId"),
            inverseJoinColumns = @JoinColumn(name = "SecurityPermissionId")
    )
    @ForeignKey(name = "FK_RolePermissionMap_SecurityRole", inverseName = "FK_RolePermissionMap_SecurityPermission")
    @CollectionId(
            columns = @Column(name="Id"),
            type=@Type(type="long"),
            generator = "identity"
    )
    public Collection<SecurityPermission> getPermissions() {
        return permissions;
    }
    public void setPermissions(Collection<SecurityPermission> permissions) {
        this.permissions = permissions;
    }
    private Collection<DBGroup> dbgroups;
    @ManyToMany(cascade = CascadeType.ALL, mappedBy = "roles")
    public Collection<DBGroup> getDbgroups() {
        return dbgroups;
    }
    public void setDbgroups(Collection<DBGroup> dbgroups) {
        this.dbgroups = dbgroups;
    }
}
When I try to create the database I get an exception:
Code:
13:23:43.751 INFO  main NullableType.nullSafeSet - could not bind value 'POST_INSERT_INDICATOR' to parameter: 2; org.hibernate.id.IdentifierGeneratorHelper$2 cannot be cast to java.lang.Long
Oct 29, 2010 1:23:43 PM org.apache.catalina.core.StandardContext listenerStart
SEVERE: Exception sending context initialized event to listener instance of class com.vitalimages.common.server.listener.DatabaseUpgradeListener
java.lang.ClassCastException: org.hibernate.id.IdentifierGeneratorHelper$2 cannot be cast to java.lang.Long
   at org.hibernate.type.LongType.set(LongType.java:65)
   at org.hibernate.type.NullableType.nullSafeSet(NullableType.java:156)
   at org.hibernate.type.NullableType.nullSafeSet(NullableType.java:138)
   at org.hibernate.persister.collection.AbstractCollectionPersister.writeIdentifier(AbstractCollectionPersister.java:868)
   at org.hibernate.persister.collection.AbstractCollectionPersister.recreate(AbstractCollectionPersister.java:1199)
   at org.hibernate.action.CollectionRecreateAction.execute(CollectionRecreateAction.java:58)
   at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:268)
   at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:260)
   at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:183)
   at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
   at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51)
   at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1206)
   at org.springframework.orm.hibernate3.HibernateAccessor.flushIfNecessary(HibernateAccessor.java:390)
   at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:407)
   at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374)
   at org.springframework.orm.hibernate3.HibernateTemplate.saveOrUpdate(HibernateTemplate.java:737)
   at com.vitalimages.common.server.domain.SecurityDAO.createDBGroup(SecurityDAO.java:95)
   at com.vitalimages.common.server.listener.DatabaseUpgradeListener.contextInitialized(DatabaseUpgradeListener.java:182)
   at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4135)
   at org.apache.catalina.core.StandardContext.start(StandardContext.java:4630)
   at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
   at org.apache.catalina.core.StandardHost.start(StandardHost.java:785)
   at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
   at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:445)
   at org.apache.catalina.startup.Embedded.start(Embedded.java:825)
   at org.codehaus.mojo.tomcat.AbstractRunMojo.startContainer(AbstractRunMojo.java:558)
   at org.codehaus.mojo.tomcat.AbstractRunMojo.execute(AbstractRunMojo.java:255)
   at org.apache.maven.plugin.DefaultPluginManager.executeMojo(DefaultPluginManager.java:490)
   at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:694)
   at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeStandaloneGoal(DefaultLifecycleExecutor.java:569)
   at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoal(DefaultLifecycleExecutor.java:539)
   at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalAndHandleFailures(DefaultLifecycleExecutor.java:387)
   at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeTaskSegments(DefaultLifecycleExecutor.java:348)
   at org.apache.maven.lifecycle.DefaultLifecycleExecutor.execute(DefaultLifecycleExecutor.java:180)
   at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:328)
   at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:138)
   at org.apache.maven.cli.MavenCli.main(MavenCli.java:362)
   at org.apache.maven.cli.compat.CompatibleMain.main(CompatibleMain.java:60)
   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
   at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
   at java.lang.reflect.Method.invoke(Method.java:597)
   at org.codehaus.classworlds.Launcher.launchEnhanced(Launcher.java:315)
   at org.codehaus.classworlds.Launcher.launch(Launcher.java:255)
   at org.codehaus.classworlds.Launcher.mainWithExitCode(Launcher.java:430)
   at org.codehaus.classworlds.Launcher.main(Launcher.java:375)
I've tried changing the generator to various other incarnations (native vs increment):
Code:
    @ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(
            name = "sec_DBGroupRoleMap",
            joinColumns = @JoinColumn(name = "DBGroupId"),
            inverseJoinColumns = @JoinColumn(name = "SecurityRoleId")
    )
    @ForeignKey(name = "FK_DBGroupRoleMap_DBGroup", inverseName = "FK_DBGroupRoleMap_SecurityRole")
    @CollectionId(
            columns = @Column(name="Id"),
            type = Type(type = "long"),
            generator = "increment"
    )
specifying a named generic generator: 
Code:
   @ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(
            name = "sec_DBGroupRoleMap",
            joinColumns = @JoinColumn(name = "DBGroupId"),
            inverseJoinColumns = @JoinColumn(name = "SecurityRoleId")
    )
    @ForeignKey(name = "FK_DBGroupRoleMap_DBGroup", inverseName = "FK_DBGroupRoleMap_SecurityRole")
    @GenericGenerator(name = "dbg_generator",strategy = "native")
    @CollectionId(
            columns = @Column(name="Id"),
            type = Type(type = "long"),
            generator = "dbg_generator"
    )
    public Collection<SecurityRole> getRoles() {
        return roles;
    }
I'm using hibernate 3.5.3 for this project.  Anyone have any suggestions?  I've read a ton of other people asking somewhat similar questions but don't see anyone posting responses that solve the problem.
viewtopic.php?f=1&t=983523viewtopic.php?f=1&t=981797&start=0Thanks,
Grant