You ask two main questions (and some additional ones):
Q1. How to do a many-to-many using a join table?
A1. There is really no way to do a many-to-many WITHOUT a join table. Follow the hibernate documentation on how to do this, it is almost painfully exhaustive. Also, this has very little to do with Struts, it's all about your database design and ORM, handled by hibernate.
Q2. How to do a many-to-many with a link table that contains some data in excess of what is needed to maintain the many-to-many relationship?
A2. In the database you simply add the extra columns to the table. In the Java/Hibernate world, you simply create another object, which holds a reference to both sides and the additional info. For example, consider a relationship among Persons and Cars. Each person can have many cars and each car can have many owners. In addition, you want to track the dates for when each person owned what car. You simply put the startDate and endDate columns into the join table and then you create an extra object, like PersonCar, which contains a Person, a Car, a startDate and an endDate.
Additional answers:
1. I am not sure what is the benefit of using 2 one-to-many relationships to model a many-to-many relationship.
2. You can use saveOrUpdate to update existing data.
You should have autoflush enabled so you should not need to call it explicitly.
Hope this helps