2014-02-12 1 views
5

Моей упрощенную модели выглядит следующим образом:форма связывания: взаимосвязь с промежуточным объектом (вложенные лицами) - созданием непрямого Entity и связыванием

@Entity public class Aspect extends Model { 
    @Id public Long id; 
    @OneToMany(cascade = CascadeType.ALL) public List<Restriction> restrictions; 
} 

@Entity public class Restriction extends Model { 
    @Id public Integer id; 
    @ManyToOne public RestrictionTemplate restrictionTemplate; 
} 

@Entity public class RestrictionTemplate extends Model { 
    @Id private Integer id; 
} 

В принципе идея заключается в следующем: каждый аспекта имеет набор ограничений. И каждый Restriction сам полагается на RestrictionTemplate.

Я хочу аспект формы творение нравится: пользователь может выбрать несколько RestrictionTemplates и форме представить новые ограничения должны быть созданы и связанные с новым Аспект.

Позволь мне еще раз объяснить: О представлении формы Я хочу создать аспект и касающийся Ограничения на основе идентификаторов RestrictionTemplate поданных.

В каких именах должны указываться поля в форме, чтобы сделать возможным такое связывание?

Наименования, который работает для прямых relantionships:

restrictions[0].restrictionTemplate.id 
restrictions[1].restrictionTemplate.id 

здесь не работает (не создает Аспект запись в БД, но не Ограничение записей).

ответ

2

Я думаю, вы просто должны написать немного кода для этого, в котором поиск для RestrictionTemplates соответствующих переданных идентификаторов, а затем назначить их на новый экземпляр Aspect:

List<RestrictionTemplates> templates = new ArrayList<RestrictionTemplates>(); 
for (int crtTplId : passedIds) { 
    templates.add(entityManager.find(RestrictionTemplates.class, crtTplId)); 
} 


List<Restriction> restrictions = new ArrayList<Restriction>(); 
for (RestrictionTemplates crtTpl : templates) { 
    restrictions.add(new Restriction(crtTpl)); 
} 

Aspect aspect = new Aspect(); 
aspect.restrictions = restrictions; 

entityManager.persist(aspect); 

PS: в Я понимаю, что могут быть ограничения, которые не принадлежат к Aspect. Если это не так, чем вы должны сделать ваши отношения двусторонний Аспекта-Restriction, Restriction быть владеющая сторона:

@Entity public class Aspect extends Model { 
    @Id public Long id; 
    @OneToMany(cascade = CascadeType.ALL, mappedBy="aspect") public List<Restriction> restrictions; 
} 

@Entity public class Restriction extends Model { 
    @Id public Integer id; 
    @OneToMany(/*+ add the @JoinColumn for marking the column not nullable*/) public Aspect aspect; 
    @ManyToOne public RestrictionTemplate restrictionTemplate; 
} 
+0

Thx за Ваш ответ! Я, очевидно, могу это сделать. Но я хочу, чтобы привязка выполнялась автоматически, когда я следую правилам именования полей. В соответствии с этим вопросом: https://groups.google.com/forum/#!searchin/play-framework/nested$20binding/play-framework/CukNF9kV_uU/NcelALWPnOAJ Play может связывать OneToMany -> OneToMany вложенные модели из поля с именем " client.customers [0] .Address [0] .zipcode». Интересно, как сделать обязательную работу в моем случае (OneToMany -> ManyToOne). – cosmolev

 Смежные вопросы

  • Нет связанных вопросов^_^