2013-12-16 1 views
4

Я создал схему в MySQL Workbench: my schema Как мне сопоставить это с объектами в 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?

ответ

7

С ManyToMany отношений необходимо определить владельца отношений.

В вашем случае это должно быть так:

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

С mappedBy он будет генерировать только один мост таблицы.

Также обратите внимание на эти вопросы, они дадут вам больше понимания:

How do I describe a bridge table to Ebean?

How do I define multiple conditions on a join JPA/Ebean

+0

Почему 'mappedBy' аннотаций только в' EntityA.java'? Или это должно быть в обоих сущностях? – pmichna

+4

Он должен быть только с одной стороны, указывая на другую сторону. До вас, в какой класс его поставить. – cosmolev