2015-01-22 8 views
0

Предположим, у нас есть две сущности, первые один:@OneToOne отношения с дополнительным ограничением

@Entity 
@Table(name = "entitya") 
public class EntityA { 

    @Id 
    @Column(name = "id") 
    private Long id; 

    @Column(name = "name") 
    private Long name; 

    @OneToMany(mappedBy = "parent", fetch = FetchType.LAZY) 
    private Set<EntityB> childEntities; 

} 

и вторая:

@Entity 
@Table(name = "entityb") 
public class EntityB { 

    @Id 
    @Column(name = "id") 
    private Long id; 

    @Column(name = "name") 
    private String name; 

    @Column(name = "master") 
    private Boolean master; 

    @ManyToOne 
    @JoinColumn(name = "parent") 
    private EntityA parent; 

} 

До сих пор, так хорошо. Однако основные таблицы базы данных и ограничения приводят к соблюдению того, что для любого entityA может быть только один EntityB с булевым полем master, установленным в true. Я могу извлечь его, добавив следующий метод entityA:

public entityB getMasterChild() { 

    for(entityB ent : childEntities) { 
    if(ent.isMaster()) { 
     return ent; 
    } 
    } 

} 

Вопрос заключается в том, могу ли я создать @OneToOne отношения в EntityA, которые могут выразить это правило, так что entityA может иметь дополнительный masterChild элемент типа entityB?

ответ

1

Если я правильно понял, что вы хотите создать/определить связь между двумя объектами на основе значения свойства какого-либо объекта. Полагают, что отношения между сущностями определяются по количеству сущностей (сколько объектов может иметь другой объект), а не по значению свойства какого-либо объекта.

Однако
Если вы действительно хотите использовать @OneToOne отображение для masterChild я бы рекомендовал создать отдельную таблицу/объект для него. Как только это будет сделано, вы можете включить этот новый объект MasterChild в EntityA и аннотировать его @OneToOne.

Здесь пока новый MasterChild Entity

@Entity 
public class MasterChild extends EntityB{ 

    @Id 
    @Column(name = "id") 
    private Long id;  
} 

Обратите внимание, что я снял 'хозяина' от EntityB, как это уже не нужны

@Entity 
@Table(name = "entityb") 
public class EntityB { 

    @Id 
    @Column(name = "id") 
    private Long id; 

    @Column(name = "name") 
    private String name; 

    @ManyToOne 
    @JoinColumn(name = "parent") 
    private EntityA parent; 

} 

И здесь модифицируется EntityA

@Entity 
@Table(name = "entitya") 
public class EntityA { 

    @Id 
    @Column(name = "id") 
    private Long id; 

    @Column(name = "name") 
    private Long name; 

    @OneToOne 
    private MasterChild master; 

    @OneToMany(mappedBy = "parent", fetch = FetchType.LAZY) 
    private Set<EntityB> childEntities; 

} 
+0

Мне очень не нравится такая модификация, но я думаю, что это цена, которую вы платите за использование пакета ORM –

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