Как мне заставить работать многие отношения @ManyToMany? - PullRequest
4 голосов
/ 12 января 2011

У меня есть модель с двумя отношениями «многие ко многим». Play Framework создает для меня табель отношений, но ни один из идентификаторов не может быть обнуляем, в результате чего я не могу заставить свой код работать.

Возвращение игровых рамок Произошло исключение PersistenceException: вставить в Costumer_Item (CustomersWhoIgnored_id, ignoredItems_id) значения (?,?)

19:20:54,530 ERROR ~ Field 'customersWhoBought_id' doesn't have a default value
19:20:54,531 ERROR ~ Could not synchronize database state with session
org.hibernate.exception.GenericJDBCException: Could not execute JDBC batch update

Код: Item.java:

@Entity
public class Item extends Model {
  @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "ownedItems")
  public List<Costumer> customersWhoBought;

  @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "ignoredItems")
  public List<Costumer> customersWhoIgnored;
}

Customer.java:

@Entity
public class Customer extends Model {
  @Column(nullable = true)
  @ManyToMany(cascade = CascadeType.ALL)
  public List<Item> ownedItems;

  @Column(nullable = true)
  @ManyToMany(cascade = CascadeType.ALL)
  public List<Item> ignoredItems;

}

Как мне заставить работать многие отношения @ManyToMany?

Ответы [ 2 ]

3 голосов
/ 22 января 2011

Я бы настоятельно рекомендовал не использовать ManyToMany, а вместо этого просто использовать отношения один-ко-многим и многие-к-одному с явным доменным объектом для середины. С ManyToMany очень легко запутаться (как вы находите), и вам все равно часто приходится добавлять дополнительные данные в ManyToMany.

Кроме того, FWIW, это намного больше проблема JPA / Hibernate, чем проблема инфраструктуры Play.

3 голосов
/ 12 января 2011

Я думаю, что оба отношения используют одну и ту же таблицу соединений с именем по умолчанию Costumer_Item, что вызывает путаницу. Вам нужно указать разные имена вручную:

@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "CostumerToOwnedItems")
public List<Item> ownedItems;

@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "CostumerToIgnoredItems")
public List<Item> ignoredItems;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...