openjpa-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Pinaki Poddar <ppod...@apache.org>
Subject Re: NPE on ManyToOne while using insertable = false, updatable = false
Date Wed, 02 Jan 2008 20:24:39 GMT

Item refers to Product via field 'produto' then why do you need a separate
Integer field 'cdProduto'?
The item constructor is taking p.getCdProduto() as last argument, so I am
assuming that the constructor is setting
item.cdProduto field but not item.produto. 

And nobody else is either so item.getProduto() is returning null.

What you can do is:
a) remove cdProduto field from Item
b) pass Produto to Item constructor
c) In Item constructor set this.producto = produto;
 
>     @Column(name = "cd_produto")    
>     private Integer cdProduto;
>     
>     @ManyToOne
>     @JoinColumn(name = "cd_produto", referencedColumnName="cd_produto",
> insertable = false, updatable = false)    
>     private Produto produto;//read only



Gilberto C Andrade wrote:
> 
> Hi,
> 
> openjpa 1.0.1, jdk 1.5
> Produto:
>> @Entity
>> @Table(name = "produto")
>> public class Produto implements Serializable {
>>     @Id
>>     @GeneratedValue(strategy=GenerationType.TABLE,
>> generator="ProdutoGerador")
>>     @TableGenerator(name="ProdutoGerador", table="ID_GERADOR",
>> pkColumnName="PK",
>>         valueColumnName="AID", pkColumnValue="produto_id_gerador",
>> allocationSize=1, initialValue=1)
>>     @Column(name="cd_produto", columnDefinition="INTEGER")
>>     private Integer cdProduto;
> 
> Item:
>> @Entity
>> @Table(name = "item")
>> public class Item implements Serializable {
>>     @Transient
>>     protected final Log log = LogFactory.getLog(getClass());
>>     @Id
>>     @GeneratedValue(strategy=GenerationType.TABLE,
>> generator="ItemGerador")
>>     @TableGenerator(name="ItemGerador", table="ID_GERADOR",
>> pkColumnName="PK",
>>         valueColumnName="AID", pkColumnValue="item_id_gerador",
>> allocationSize=1, initialValue=1)
>>     @Column(name="cd_item", columnDefinition="INTEGER")
>>     private Integer cdItem;
> .
> .
> .
>>     
>>     @Column(name = "cd_produto")    
>>     private Integer cdProduto;
>>     
>>     @ManyToOne
>>     @JoinColumn(name = "cd_produto", referencedColumnName="cd_produto",
>> insertable = false, updatable = false)    
>>     private Produto produto;//read only
> 
> OBS.: Originally this was mapped the following way, using hibernate's tag:
>>       <many-to-one
>>             name="produto"
>>             class="org.appfuse.model.estoque.Produto"
>>             cascade="none"
>>             outer-join="true"
>>             update="false"
>>             insert="false"
>>             access="property"
>>             column="cd_produto"
>>         />
> 
> 
> 
> Test:
>>     @Test
>>     public void persistRemoveItemTest() {
>>         log.debug("\npersistRemoveItemTest - Criação de uma instância da
>> classe Item\n");
>>         String nomeItem = "Calça";
>>         Integer cdItem = null;
>>         BigDecimal precoVenda = new BigDecimal(0.0F);
>>         BigDecimal precoCusto = new BigDecimal(0.0F);
>>         UnidadeMedida uM = em.find(UnidadeMedida.class, "MT");
>>         Float estoqueAtual = 0.0F;
>>         Float estoqueMinimo = 0.0F;
>>         Float nivelDeReposicao = 0.0F;
>>         Boolean flDescontinuado = false;
>>         Produto p = em.find(Produto.class, 1);
>>        
>>         Item i = new Item(nomeItem,precoVenda, precoCusto,
>> uM.getCdUnidadeMedida(), estoqueAtual, estoqueMinimo, nivelDeReposicao,
>> flDescontinuado, p.getCdProduto());
>>         assertNull("cdItem antes do método persist:",i.getCdItem());
>>         em.getTransaction().begin();
>>         em.persist(i);
>>         em.getTransaction().commit();
>>         log.debug("Objeto pós gravação: \n"+i);
>>         cdItem = i.getCdItem();
>>         i = null;
>>        
>>         assertNotNull("cdItem pós persist:",cdItem);
>>         
>>         Item i2 = em.find(Item.class, cdItem);
>>         log.debug("Objeto carregado: \n"+i2);
>>         assertNotNull("Não pode ser
>> nulo:",i2.getProduto());<==================== Here is the problem!
>>     }
> 
> As you can see I'm testing the lazy load of the Produto class. But i2
> instance comes with null produto.
> 
> Is there anything wrong with my mapping?
> 
> Thanks,
> 
> Gilberto
> 
> 

-- 
View this message in context: http://www.nabble.com/NPE-on-ManyToOne-while-using-insertable-%3D-false%2C-updatable-%3D-false-tp14582403p14585575.html
Sent from the OpenJPA Users mailing list archive at Nabble.com.


Mime
View raw message