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