With no other columns in the link table:
Code:
public class Employee
{
private long _id = -1;
private int _version = -1;
private Set _tasks = new HashSet( );
private void setId( long id ) { _id = id; }
public long getId( ) { return _id; }
private void setVersion( int version ) { _version = version; }
private int getVersion( ) { return _version; }
public void setTasks( Set tasks ) { _tasks = tasks; }
public Set getTasks( ) return _tasks;
public void addTask( Task task )
{
if( task != null ) _tasks.add( task );
}
public Task removeTask( Task task )
{
if( task != null ) _tasks.remove( task );
}
}
public class Task
{
private long _id = -1;
private int _version = -1;
private Set _employees = new HashSet( );
private void setId( long id ) { _id = id; }
public long getId( ) { return _id; }
private void setVersion( int version ) { _version = version; }
private int getVersion( ) { return _version; }
public void setEmployees( Set employees ) { _employees = employees; }
public Set getEmployees( ) return _employees;
public void addEmployee( Employee employee )
{
if( employee != null ) _employees.add( employee );
}
public Employee removeEmployee( Employee employee )
{
if( employee != null ) _employee.remove( employee );
}
}
<hibernate-mapping>
<class name="Employee" table="employee">
<id name="id" column="employee_id">
<generator class="native"/>
</id>
<version name="version" column="version"/>
<set name="tasks" inverse="false" cascade="all" lazy="true">
<key column="employee_id"/>
<many-to-many class="Task"/>
</set>
</hibernate-mapping>
<hibernate-mapping>
<class name="Task" table="task">
<id name="id" column="task_id">
<generator class="native"/>
</id>
<version name="version" column="version"/>
<set name="employees" inverse="true" cascade="none" lazy="true">
<key column="task_id"/>
<many-to-many class="Employee"/>
</set>
</hibernate-mapping>
In the above example, the tasks collection of an employee is saved when the employee is saved, but employees are not saved when a task is saved (note the inverse="true/false" on both mappings).
If you have other columns in your link table, then you will need to make a third class (EmployeeTask). In that case, it is recommended that you add a primary key column to the EMPLOYEE_TASK table so that you don't have a composite-key (they are a pain). Your Employee and Task classes would then have Sets of EmployeeTask objects that you would have to do some extra maintenance on:
Code:
public class Employee
{
private long _id = -1;
private int _version = -1;
private Set _employeeTasks = new HashSet( );
private void setId( long id ) { _id = id; }
public long getId( ) { return _id; }
private void setVersion( int version ) { _version = version; }
private int getVersion( ) { return _version; }
public void setEmployeeTasks( Set employeeTasks ) { _employeeTasks = employeeTasks; }
public Set getEmployeeTasks( ) return _employeeTasks;
public void addTask( Task task )
{
if( task != null )
{
EmployeeTask employeeTask = new EmployeeTask( );
employeeTask.setEmployee( this );
employeeTask.setTask( task );
_employeeTasks.add( employeeTask );
}
}
public Task removeTask( Task task )
{
if( task != null )
{
for( Iterator i = _employeeTasks.iterator( ); i.hasNext( ); )
{
EmployeeTask employeeTask = (EmployeeTask)i.next( );
if( employeeTask.getTask( ).equals( task ) ) i.remove( );
}
}
}
}
public class Task
{
private long _id = -1;
private int _version = -1;
private Set _employeeTasks = new HashSet( );
private void setId( long id ) { _id = id; }
public long getId( ) { return _id; }
private void setVersion( int version ) { _version = version; }
private int getVersion( ) { return _version; }
public void setEmployees( Set employees ) { _employees = employees; }
public Set getEmployees( ) return _employees;
public void setEmployeeTasks( Set employeeTasks ) { _employeeTasks = employeeTasks; }
public Set getEmployeeTasks( ) return _employeeTasks;
public void addEmployee( Employee employee )
{
if( employee != null )
{
EmployeeTask employeeTask = new EmployeeTask( );
employeeTask.setTask( this );
employeeTask.setEmployee( employee );
_employeeTasks.add( employeeTask );
}
}
public Task removeEmployee( Employee employee )
{
if( employee != null )
{
for( Iterator i = _employeeTasks.iterator( ); i.hasNext( ); )
{
EmployeeTask employeeTask = (EmployeeTask)i.next( );
if( employeeTask.getEmployee( ).equals( employee ) ) i.remove( );
}
}
}
}
<hibernate-mapping>
<class name="Employee" table="employee">
<id name="id" column="employee_id">
<generator class="native"/>
</id>
<version name="version" column="version"/>
<set name="employeeTasks" inverse="false" cascade="all" lazy="true">
<key column="employee_id"/>
<one-to-many class="EmployeeTask"/>
</set>
</hibernate-mapping>
<hibernate-mapping>
<class name="Task" table="task">
<id name="id" column="task_id">
<generator class="native"/>
</id>
<version name="version" column="version"/>
<set name="employeeTasks" inverse="true" cascade="none" lazy="true">
<key column="task_id"/>
<one-to-many class="EmployeeTask"/>
</set>
</hibernate-mapping>
The EmployeeTask class and mapping should be trivial.