Я создал схему в MySQL Workbench: Как мне сопоставить это с объектами в Ebean в Play Framework? В учебниках они используют подход для написания класса модели, аннотируют его @Entity
и позволяют воспроизводить сценарий SQL, но нет никаких проблем с типами данных (например, как установить лимит на VARCHAR).Ebean и отношения многие-ко-многим - как?
Что относительно отношений «многие ко многим»? В моем случае - должен ли я создать класс сущности UsersScenarios
или мне нужно создать модель Scenario
с некоторым полем, содержащим коллекцию объектов Users
и модель User
, содержащую коллекцию Scenario
объектов? Или, может быть, я должен развить схему в MySQL Workbench и каким-то образом отобразить ее в своем приложении?
Пожалуйста, помогите мне, так как у меня нет опыта ORM.
EDIT: Я сделал небольшой тест с двумя моделями:
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;
Так что кажется сценарий эволюции не идеален - зачем мне нужны две таблицы, соединяющие EntityA
и EntityB
?
Почему 'mappedBy' аннотаций только в' EntityA.java'? Или это должно быть в обоих сущностях? – pmichna
Он должен быть только с одной стороны, указывая на другую сторону. До вас, в какой класс его поставить. – cosmolev