Поскольку вы используете JPA, который является объектно-реляционным картографом, спроектируйте его так, как если бы JPA и базы данных не были задействованы.
Я имею в виду построение вашей объектной модели (java-классов) таким образом, чтобы иметь смысл для объектов и отношений, которые вы пытаетесь захватить, - затем подумайте о правильной настройке JPA вокруг этих объектов.
В последний раз, когда я использовал JPA, это было примерно в то время, когда выпускался 2.0, поэтому я не помню, насколько полно спецификация поддерживает использование полей, которые являются реализациями java.util.map, но карта была бы хорошей путь, если он поддерживается.
В частности, в вашем объекте Product может быть поле типа Map.
Map<User,Vote> votesOnThisProduct;
Но, честно говоря, все, что кажется наиболее рациональным, когда вы думаете об этом только с точки зрения java-классов, игнорируя JPA и образ мышления баз данных, - это путь.
Другие параметры могут определять дополнительные классы, такие как
public class ProductVoteRecord
{
User user;
Vote vote;
Product product;
}
, а затем сделать пользователя и продукт (и, возможно, голосовать) составным первичным ключом с помощью аннотаций JPA.
Но даже такой класс демонстрирует признаки отравления реляционным дизайном, поскольку по сути это стол для соединения.