Hibernate - Объявление временного объекта в Pojo - PullRequest
2 голосов
/ 19 февраля 2009

У меня есть pojo, который является объектом A таблицы TableA

TableA (int a1,int a2).

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

b3 недопустим в Таблице A, но я все еще хочу использовать одно и то же pojo для обоих (это очень большое pojo, и будет большое дублирование кода, если оно будет иметься только для запроса)

Я объявил в пойо

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

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

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

Но Hibernate просто игнорирует параметр и никогда не использует "setB3 ()" .. Когда я удаляю @Transient, он работает (и, естественно, не может при вставке в таблицу), поэтому все имена правильные

Как я могу это исправить?

Спасибо!

Ответы [ 4 ]

3 голосов
/ 03 марта 2009

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

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

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

0 голосов
/ 05 января 2015

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

0 голосов
/ 19 февраля 2009

Вы смешали аннотации к полям и методам?

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

@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 голосов
/ 19 февраля 2009

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

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

Тип доступа

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

Запрещено аннотировать поле и метод с помощью @Id для данной сущности.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...