【问题标题】:Many-to-many relationship in play framework java游戏框架java中的多对多关系
【发布时间】:2014-04-16 15:13:15
【问题描述】:

我正在尝试使用多对多方法产品与商店有多对多关系 Product.java

package models;
@Entity
public class Product extends Model {

    @Id
    @SequenceGenerator(name="product_gen", sequenceName="product_id_seq", allocationSize=1)
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="product_gen")
    @Column(name="id")
    public Long id;

    @Required
    public String name;

    @Required
    public Float price;

    @ManyToMany(cascade = CascadeType.ALL)
    public List<Shop> shops = new ArrayList<Shop>();

    public Product(String name, float price) {
        this.name = name;
        this.price = price;
    }
    public static List<Product> all(){
        return find.all();
    }
    public static Model.Finder<Long, Product> find = new Model.Finder(Long.class, Product.class);

    public static Product create(String name,float price) {
        Product product = new Product(name, price);
        product.save();
        product.saveManyToManyAssociations("shops");
        return product;
    }




}

play 创建了一个表 product_shop,其中 shop_id 和 product_id 作为外键,但在添加产品时无法在 product_shop 表中存储任何值 任何帮助将不胜感激。

【问题讨论】:

  • 如果在@ManyToMany 后面添加一个@JoinTable(name = "product_shop") 会怎样
  • 还是一样的输出

标签: java playframework many-to-many ebean


【解决方案1】:

我有AppsUsers。每个应用可以有多个用户,每个用户可以使用多个应用。

在您的情况下,您可以将App 替换为Product 并将User 替换为Shop

这是我在 Play 下的工作代码! 2.2.2

数据库的演变:

create table app_user (
  id                varchar(40) not null,
  constraint pk_fb_user primary key (id)
);

create table app (
  id                    varchar(40) not null,
  name                  text,
  constraint pk_app_id primary key (id)
);

create table membership (
  app_id                varchar(40) not null,
  app_user_id           varchar(40) not null,
  constraint fk_membership_app_id foreign key (app_id) references app,
  constraint fk_membership_app_user_id foreign key (app_user_id) references app_user
);

模型应用

@Entity
public class App extends Model {

    @Id
    public UUID id;

    @Column
    public String name;

    @ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "membership")
    public List<User> users;

    ....
}

模型用户

@Entity
@Table(name = "app_user")
// user is reserved keyword in DB
public class User extends Model {

    @Id
    public UUID id;

}

我不需要访问用户的应用,所以我在用户中没有应用字段。

【讨论】:

    【解决方案2】:

    尝试查看嵌入的 ID。

    为你的主键创建一个类

    @Embeddable
    public class ProductShopKey {
     public Long productId;
     public Long shopId;
    
     public boolean equals(Object object) {
      if(object isInstanceOf ProductShopKey){
       ProductShopKey key = (ProductShopKey) object
       if(this.productId == key.productId
          && this.shopId == key.shopId
         ){
            return true;
       }
      }
      return false;
     }
    
     public int hashCode() {
      return productId.hashCode() + shopId.hashCode();
     }
    }
    

    然后为类创建一个实体

    @entity
    public class ProductShop {
     @EmbeddedId
     public ProductShopKey psKey = new ProductShopKey();
    
     @ManyToOne
     @JoinColumn(name = "product_id")
     public Product product;
    
     @ManyToOne
     @JoinColumn(name = "shop_id")
     public Shop shop;
    
     //Extra value to go in your join table
     public String someValue;
     ...
    }
    

    那么ShopProduct 分别与ProductShop 存在一对多关系

    手动向表中插入条目

    ProductShop ps = new ProductShop();
    ps.psKey.productId = someProductId;
    ps.psKey.shopId = someShopId;
    ps.someValue = someValue;
    ps.save();
    

    【讨论】:

    • 执行此操作时出错PersistenceException: SERIOUS ERROR: The hashCode() and equals() methods *MUST* be implemented on Embedded bean class models.ProductShopKey as it is used as an Id for class models.ProductShop
    • 是的。只需执行它告诉您的任何事情,但是您认为应该这样做。我已经用一个例子更新了我的答案。
    • product_shop 表中仍然没有插入数据
    • 我已经给出了一个如何插入的例子。不幸的是,据我所知,它需要手动完成。我还将someValue 从键类中取出并将其移到实体类中,因为它不是组合键的一部分。希望这会有所帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-31
    • 2017-01-28
    • 2011-12-17
    • 1970-01-01
    相关资源
    最近更新 更多