繁体   English   中英

Ebean和多对多的关系 - 怎么样?

[英]Ebean and many-to-many relationships - how?

我在MySQL Workbench中创建了一个模式: 我的架构 如何将此映射到Play Framework中的Ebean中的实体? 在教程中,他们使用方法编写模型类,使用@Entity注释它并让Play生成SQL脚本,但不关心数据类型(例如,如何设置VARCHAR限制)。

那么多对多关系怎么样? 在我的情况-我应该创建一个实体类UsersScenarios或者我应该创建一个Scenario包含集合一些领域模型Users对象和User包含集合模型Scenario的对象? 或者也许我应该在MySQL Workbench中创建模式并以某种方式将其映射到我的应用程序中?

请帮助我,因为我没有任何ORM经验。

编辑:我用两个模型做了一点测试:

EntityA.java:

package models;

import java.util.*;

import play.db.ebean.*;
import play.data.validation.Constraints.*;

import javax.persistence.*;

@Entity
public class EntityA extends Model {

        @Id
        public Long id;

        @Required
        public String label;

        @ManyToMany
        public List<EntityB> entitiesB = new ArrayList<EntityB>();

        public static Finder<Long,EntityA> find = new Finder(
                        Long.class, EntityA.class
        );
}

EntityB.java

package models;

import java.util.*;

import play.db.ebean.*;
import play.data.validation.Constraints.*;

import javax.persistence.*;

@Entity
public class EntityB extends Model {

        @Id
        public Long id;

        @Required
        public String label;

        @ManyToMany
        public List<EntityA> entitiesA = new ArrayList<EntityA>();

        public static Finder<Long,EntityB> find = new Finder(
                        Long.class, EntityB.class


   );
}

生成的SQL演变:

create table entity_a (

id                        bigint auto_increment not null,

label                     varchar(255),

constraint pk_entity_a primary key (id))

;



create table entity_b (

id                        bigint auto_increment not null,

label                     varchar(255),

constraint pk_entity_b primary key (id))

;





create table entity_a_entity_b (

entity_a_id                    bigint not null,

entity_b_id                    bigint not null,

constraint pk_entity_a_entity_b primary key (entity_a_id, entity_b_id))

;



create table entity_b_entity_a (

entity_b_id                    bigint not null,

entity_a_id                    bigint not null,

constraint pk_entity_b_entity_a primary key (entity_b_id, entity_a_id))

;







alter table entity_a_entity_b add constraint fk_entity_a_entity_b_entity_a_01 foreign key (entity_a_id) references entity_a (id) on delete restrict on update restrict;



alter table entity_a_entity_b add constraint fk_entity_a_entity_b_entity_b_02 foreign key (entity_b_id) references entity_b (id) on delete restrict on update restrict;



alter table entity_b_entity_a add constraint fk_entity_b_entity_a_entity_b_01 foreign key (entity_b_id) references entity_b (id) on delete restrict on update restrict;



alter table entity_b_entity_a add constraint fk_entity_b_entity_a_entity_a_02 foreign key (entity_a_id) references entity_a (id) on delete restrict on update restrict;

所以似乎演化脚本并不完美 - 为什么我需要两个连接EntityAEntityB表?

使用ManyToMany关系,您需要定义关系的所有者。

在你的情况下它应该是这样的:

@ManyToMany(mappedBy = "entitiesA")
public List<EntityB> entitiesB = new ArrayList<EntityB>();

使用mappedBy ,它将只生成一个桥表。

另外看看这些问题,它们会让你更加了解:

如何描述Ebean的桥接表?

如何在连接JPA / Ebean上定义多个条件

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM