2014-11-09 8 views
0

Учитывая следующие классы и интерфейс мне интересно, как JPA обрабатывает его: пребываниеУпорство реализации, которая не имеет никаких свойств

public interface Operator{ 
    public String getOperator(); 
} 

Давайте я тогда две реализации этого класса:

public class PlusOperation implements Operator, Serializable { 
    public String getOperator(){ 
     return "+"; 
    } 
} 

И :

public class MinusOperation implements Operator, Serializable { 
    public String getOperator(){ 
     return "-"; 
    } 
} 

Там существует класс, помеченный как @Entity, который имеет ар roperty Operator:

@Entity 
public class Function { 
    @Id @GeneratedValue 
    private Long id; 
    private Operator operator; 
    // Other methods & properties omitted for clarity 
} 

В классе функций, следовательно, он может провести либо PlusOperation или MinusOperation и ни один из этих классов были аннотированный с @Entity, поскольку они не имеют каких-либо свойств, которые требуют сохраняющиеся, но каждый из них разные , Как JPA справляется с этим? При сохранении объекта Function оно автоматически (и «за кулисами») маркирует свойство operator с правильной реализацией Operation?

+2

Сущность - способ хранения ** данных **. Не способ хранения поведения. Это полное злоупотребление ORM. Не. –

+0

В любом случае это не сработает, поскольку единственный способ сохранить оператора - это сериализовать его, и это не Serializable. –

+0

Борис, я согласен, но это то, с чем мне нужно работать, поэтому вопрос остается. Также JB Nizet я реализовал интерфейс Serializable. – Kerry

ответ

0

Просто добавьте JPA AttributeConverter, который хранит поле «operator» в виде строки или целого. Таким образом, не имеет значения, имеет ли этот другой тип (который не является сущностью) никаких собственных свойств. Затем ваш конвертер отвечает за определение того, что сохраняется и как его извлекают.

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