2009-02-19 4 views
2

У меня есть POJO, что является объект А, таблицы TableAHibernate - Декларирование преходящее объект в POJO

TableA (int a1,int a2).

Чтобы заполнить таблицу, я выполнить запрос, который возвращает (INT a1, Int a2, логическое b3) (и запускает многочисленные проверки данных)

b3 не является допустимым в TableA, но я все равно хочу использовать тот же Pojo для обоих (это очень большой POJO, и это будет главным код дублирования, чтобы один раз для запроса)

Я объявленным в POJO

@Transient 
Boolean getB3() {..} 
void setB3(Boolean b3) {..} 

и в запрос Я объявил, что ожидаю получить значение b3:

<return> ... 
<return-property name="b3" column="b3"/> 
... 
</return> 

Но Hibernate просто игнорирует параметр и никогда не использовать «setB3()» .. Когда я удалить @Transient, он работает (и затем не при вставке в таблицу, естественно) - так что все имена правильный

Как это исправить?

Спасибо!

ответ

3

Хорошо, другая идея. Думаю, поскольку вы отметили свойство как переходный спящий режим, он не будет загружать и не сохранять свойство.

Одним из решений может быть создание двух классов. Один без свойства b. Второй - от первого, используя аннотацию mappedSuperclass.

Или вы можете попробовать сопоставить его с каким-то formula, который просто предоставляет определенное значение по умолчанию (например, false). Таким образом, для «нормального» случая, когда вы спящий режим будет использовать формулу, что приведет к некоторому значению по умолчанию, а для вашего специального запроса вы используете любую логику в этом запросе.

+0

О формуле - хорошая идея, но она не будет работать, потому что результат основан на других полях запроса, которые не находятся в таблице. Что касается другого варианта, я пытаюсь избежать этого, потому что он будет требуется также интерфейс + 2 класса, и все, что я хочу, это pojo :( – Yossale

+0

Что плохого в отношении двух классов и интерфейса, если нет дублирования? –

+0

Я думаю, что я не совсем понял, что я имел в виду с Формальный подход. Отредактирован ответ, чтобы уточнить его. –

0

Где ваша аннотация? Это на геттере или сеттере или на поле?

Если он находится в спящем поле, он будет смотреть только на поля, чтобы найти другие аннотации. не

Тип доступа

Атрибут по AccessType больше не доступен в @Entity, @EmbeddableSuperclass, @Embeddable. Тип доступа для данного объекта угадывается из позиции аннотации @Id или @EmbeddedId. Если у объекта есть @Id в поле, тип доступа будет полем, и все аннотации будут прочитаны в полях. То же самое для методов. @MappedSuperclass (ранее @EmbeddableSuperclass) и @Embeddable наследуют тип доступа от своего> владеющего объекта.

Аннотирование поля и метода с помощью @Id для данного объекта запрещено.

Если по какой-либо причине вы хотите смешивать типы доступа в данной Entity или между Entity и его MappedSuperclass/Embeddable, вы можете использовать аннотацию @AccessType Hibernate (дополнительную информацию см. В справочной документации).

Это из http://www.hibernate.org/398.html

+0

Я действительно не понял, что вы говорите, извините – Yossale

+0

Я говорю в основном так же, как и другой ответ –

0

У вас смешанные аннотации на полях и методах?

Например, это не будет работать:

@Entity 
public class A { 
    @Id 
    @GeneratedValue 
    private Long id; 

    @Column 
    private String b; 

    private String c; 

    public void setB(String b) { this.b = b; } 
    public String getB() { return b; } 

    @Transient // inconsistent with other annotations 
    public void setC(String c) { this.c = c; } 
    public String getC() { return c; } 
} 

Принимая во внимание эту волю:

@Entity 
public class A { 
    @Id 
    @GeneratedValue 
    private Long id; 

    @Column 
    private String b; 

    @Transient // consistent with other annotations 
    private String c; 

    public void setB(String b) { this.b = b; } 
    public String getB() { return b; } 

    public void setC(String c) { this.c = c; } 
    public String getC() { return c; } 
} 
+0

Нет, все в нужном месте, но оно по-прежнему не работает :( – Yossale

0

Попробуйте @Transient, по методу get, а не по методу set.

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