Три таблицы - типичный способ сделать это на самом деле, вашему подходу просто не хватает изящества JPA.
Обычно у вас есть три таблицы, связанные следующим образом:
AuthUser AuthUser_Role (association) Role
frank ---- frank,admin ----- admin
На самом деле это то, что Eclipselink пытался отобразить для вас, но в целом вы не создаете отображение AuthUser_Role самостоятельно.Вместо этого вы создаете поле в AuthUser, например:
@ManyToMany
Set<Roles> userRoles
и (опционально) в роли, например:
@ManyToMany(mappedBy="userRoles")
Set<AuthUser> usersWithRole;
Тогда EclipseLink позаботится о таблице соединений для вас и всех васнужно беспокоиться о поле userRoles, которое будет обновлять объединение.
Вы можете расширить это, чтобы создать объединение вручную, например, для ролей, которые начинаются и заканчиваются в определенный день и т. д., но для всех, кроме большинствасложные проекты, которые обычно не нужны, и часто могут быть выполнены по-другому.В целях обеспечения соответствия проще использовать, например, одно из расширений ELUG для хранения и доступа к истории изменений, что является наиболее распространенной причиной, с которой я столкнулся при добавлении дополнительных метаданных к информации о соединении.
В качестве альтернативы, если вы ДЕЙСТВИТЕЛЬНО хотите сделать это только с двумя таблицами, сделайте AuthUserRole первичной стороной, а AuthUser - пассивной.
@Entity
public class AuthUser {
@Id
private int uid;
private String password;
@OneToMany(mappedBy="user")
private Set<AuthUserRole> roles;
}
@Entity
public class AuthUserRole {
@Embeddedid
private AuthUserRolePK authUserRolePK;
}
@Embeddable
public class AuthUserRolePK {
public AuthUser user;
public int role;
}
В этом случае вы получитетолько две таблицы, и поле «user» действительно будет равно uid AuthUser в базе данных, оно просто отображается как объект на стороне Java.