如何让许多@ManyToMany关系起作用?

时间:2011-01-12 19:06:21

标签: hibernate jpa playframework

我有一个包含两对多关系的模型。 Play框架为我创建了关系表,但是没有一个id可以为空,导致我无法让我的代码工作。

播放框架返回     发生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 个答案:

答案 0 :(得分:3)

我认为两个关系都使用默认名称为Costumer_Item的相同连接表,这会导致混淆。您需要手动指定不同的名称:

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

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

答案 1 :(得分:3)

我强烈建议不要使用ManyToMany,而只是使用一对多和多对一关系,中间有一个显式域对象。很容易与ManyToMany混淆(正如您所发现的那样),并且您经常不得不向ManyToMany添加其他数据。

此外,FWIW,这是一个JPA / Hibernate问题,而不是Play框架问题。