Аннотации в датануклеусе - PullRequest
       13

Аннотации в датануклеусе

0 голосов
/ 26 октября 2011

Я пытаюсь вставить представление, используя datanucleus, проблема в том, что когда я помещаю @Persistent в поле, которое не имеет соответствующего поля в таблице, и я улавливаю ошибку:

11: 03: 42,782 ИНФОРМАЦИЯ [br.com.sigel.server.censo.dao.persistentDAO.ParametrosCensoDAO] - javax.jdo.JDODataStoreException: исключение выдает сбрасывающие изменения в хранилище данных NestedThrowables: java.sql.BatchUpdateException: ORA-01733: виртуальный столбец здесь не разрешен

но когда я добавляю @NotPersistent, поля не отображаются и поля остаются пустыми. Мне нужно, чтобы эти поля были заполнены согласно представлению, но никогда не перезаписывались (только для чтения).

Мой код:

    @PersistenceCapable(identityType = IdentityType.APPLICATION,detachable="true", table="VW_FILA_CENSO") 
    @Sequence(datastoreSequence = "SEQ_SG_FICE_SEQ", strategy = SequenceStrategy.CONTIGUOUS, name = "seqFice")
    @Cacheable("false")
    public class SG_Fila_Censo implements BeanModelTag,Serializable {
private static final long serialVersionUID = 1L;
@NotPersistent 
private Integer escoSeq;
@Persistent(primaryKey="true", valueStrategy=IdGeneratorStrategy.SEQUENCE, sequence="seqFice")
    private Integer fice_seq;

@Persistent
private Date fice_data_solicitacao; 

@Persistent
private Boolean fice_processando;

@Persistent
private Boolean fice_priorizado;

@Persistent
private Integer fice_rece_seq;

@Persistent
private Integer fice_colb_seq;

@Persistent
private String unidade_escolar;

@Persistent
private String nome_colaborador;

@Persistent
private Integer etapa_relatorio;

@Persistent
private String cree_cod;

...

Мой взгляд:

CREATE OR REPLACE VIEW "SCH_SECULT3"."VW_FILA_CENSO"
(FICE_SEQ,FICE_DATA_SOLICITACAO,FICE_PROCESSANDO,FICE_PRIORIZADO,FICE_RECE_SEQ,FICE_COLB_SEQ,unidade_escolar,nome_colaborador,cree_cod,etapa_relatorio)
AS
(SELECT
    SG_FILA_CENSO.FICE_SEQ,
    SG_FILA_CENSO.FICE_DATA_SOLICITACAO,
    SG_FILA_CENSO.FICE_PROCESSANDO,
    SG_FILA_CENSO.FICE_PRIORIZADO,
    SG_FILA_CENSO.FICE_RECE_SEQ,
    SG_FILA_CENSO.FICE_COLB_SEQ,
    VW_RELATORIO_CENSO.unidade_escolar,
    VW_RELATORIO_CENSO.nome_colaborador,
    VW_RELATORIO_CENSO.cree_cod,
    VW_RELATORIO_CENSO.rece_etapa
    FROM SG_FILA_CENSO,VW_RELATORIO_CENSO
    where SG_FILA_CENSO.fice_rece_seq = VW_RELATORIO_CENSO.rece_seq
);

Кто-нибудь может мне помочь? Спасибо.

Ответы [ 2 ]

2 голосов
/ 27 ноября 2013

вы можете поместить аннотацию @Column (inserttable = false) (например, @Column (name = "SOURCE_DESC", length = 512, inserttable = false) - вычисляемый атрибут представления БД).Это говорит единице персистентности не вставлять значение этого столбца в таблицу БД.Но все же значение будет запрошено при получении данных из представления БД.

Гедиминас

0 голосов
/ 13 мая 2012

Насколько я знаю, вы не можете использовать JDO для операций записи в представлении (даже если БД может поддерживать его).Однако вы можете использовать расширение DataNucleus (поэтому оно не является частью спецификации JDO) для целей чтения в представлении.В этом Documentenion DataNucleus показано, как вы можете использовать представления для целей только для чтения.

Аннотация @NotPersisted сообщает DataNucleus, что он должен оставить поле в покое, поэтому его логично, что он не заполняетсяэто с данными из БД.

Я также заметил некоторые другие вещи в вашем примере кода;Почему вы не используете примитивы для логических и целых чисел?Их счетчики объектов (которые вы используете), как правило, используются только для использования в общих коллекциях, и если вам действительно нужно значение 'null' в качестве значения.Автобокс гарантирует, что вы не видите разницу.Приматы работают быстрее и не используют столько памяти, и поэтому вместо них принято использовать их.

...