Как связать две сущности на основе сравнения свойств в спящем режиме?

Я хотел бы создать необязательную связь ManyToOne между двумя объектами в зависимости от того, entity1.name equals entity2.nameOf1, но я не хочу поддерживать эти отношения в своем сервисном слое, добавляя, удаляя, выбирая объекты, я просто хочу, чтобы, когда я получаю entity2, либо hibernate добавляет left join entity1 e1 on e1.name = e2.nameOf1 на запрос выбора или что он ожидает вызова entity2.getEntity1(), чтобы запросить entity1 с where e1.name == ? с именем Of1 в качестве аргумента. До сих пор я пытался использовать аннотацию @JoinFormula, но документации об этом очень мало. Я использую hibernate версию 3.5.6 с аннотациями.

@Entity
public class Entity1 {
   @Id
   @GeneratedValue
   private Long id;
   @Column(unique = true)
   private String name;

   ...getter&setters...
}
@Entity
public class Entity2 {
   @Id
   @GeneratedValue
   private Long id;

   private String someProp;
   private String nameOf1;

   @ManyToOne(optional = true)
   // How to join them? this doesn't work
   // @JoinColumnsOrFormulas({ @JoinColumnOrFormula(formula = 
   //      @JoinFormula(value = "nameOf1", referencedColumnName = "name")) })
   // neither does
   // @JoinColumnsOrFormulas({ @JoinColumnOrFormula(column =
   //      @JoinColumn(name = "nameOf1", referencedColumnName = "name", 
   //          insertable = false, updatable = false, nullable = true)) })
   //@Fetch(FetchMode.JOIN)
   private Entity1 entity1;

   ...getter and setters...
}

1 ответ

Решение

Я думаю, что вы должны просто использовать запрос, чтобы сделать это:

select e1 from Entity1 e1 where e1.name = :name

Если вы действительно хотите пойти по этому пути, достаточно использовать ManyToOne с JoinColumn. Вы должны сделать его не вставляемым и не обновляемым, хотя:

@ManyToOne(optional = true)
@JoinColumn(name = "nameOf1", referencedColumnName = "name", 
            insertable = false, updatable = false)
private Entity1 entity1;
Другие вопросы по тегам