You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@openjpa.apache.org by Himadri <hi...@yahoo.co.in> on 2010/06/30 07:00:37 UTC

Issue with ID column for Database view as Entity (EJB3.0)

Hi,

My requirement is to use a database view as EJB3.0 Entity. I suppose this
doesnt need any extra effort. table name tag is db view name instead of
table name. This is how it looks like 

@Entity
@Table(name="Property_V")
@NamedQueries({
@NamedQuery(name="findPropsByName" ,query="Select o from PropertyView o
where o.name = :a"),
})
public class PropertyView extends PropertyViewBean {}


I have only getter methods in Entity and no setters. The issue comes only
when I declare ID column in entity.
	@Column(name="ID")
	public String id ;
	public String getId() {
		return this.id; 
	}

Its varchar2 in oracle database but somehow openjpa interpret it as BIGINT
and throws me below ! This is coming when I try to call the namedquery. 

javax.ejb.EJBException: EJB Exception: ; nested exception is: 
	<openjpa-0.0.0-rnull fatal user error>
org.apache.openjpa.persistence.ArgumentException:
"com.sample.magic.poc.domain.PropertyViewBean.id" declares a column that is
not compatible with the expected type "varchar".  Column details:
Full Name: Property_V.id
Type: bigint
Size: 0
Default: null
Not Null: true

	at
weblogic.ejb.container.internal.RemoteBusinessIntfProxy.unwrapRemoteException(RemoteBusinessIntfProxy.java:105)
	at
weblogic.ejb.container.internal.RemoteBusinessIntfProxy.invoke(RemoteBusinessIntfProxy.java:87)
	at $Proxy0.getProperties(Unknown Source)
	at test.junit.TestSample.testView(TestSample.java:67)
	at test.junit.TestSample.main(TestSample.java:26)
Caused by: <openjpa-0.0.0-rnull fatal user error>
org.apache.openjpa.persistence.ArgumentException:
"com.tieto.magic.poc.domain.PropertyViewBean.id" declares a column that is
not compatible with the expected type "varchar".  Column details:
Full Name: Property_V.id
Type: bigint
Size: 0
Default: null
Not Null: true

	at
org.apache.openjpa.jdbc.meta.MappingInfo.mergeColumn(MappingInfo.java:659)
	at
org.apache.openjpa.jdbc.meta.MappingInfo.createColumns(MappingInfo.java:518)
	at
org.apache.openjpa.jdbc.meta.ValueMappingInfo.getColumns(ValueMappingInfo.java:143)
	at
org.apache.openjpa.jdbc.meta.strats.StringFieldStrategy.map(StringFieldStrategy.java:79)
	at
org.apache.openjpa.jdbc.meta.FieldMapping.setStrategy(FieldMapping.java:120)
	at
org.apache.openjpa.jdbc.meta.RuntimeStrategyInstaller.installStrategy(RuntimeStrategyInstaller.java:80)
	at
org.apache.openjpa.jdbc.meta.FieldMapping.resolveMapping(FieldMapping.java:438)
	at org.apache.openjpa.jdbc.meta.FieldMapping.resolve(FieldMapping.java:403)
	at
org.apache.openjpa.jdbc.meta.ClassMapping.resolveNonRelationMappings(ClassMapping.java:851)
	at
org.apache.openjpa.jdbc.meta.MappingRepository.prepareMapping(MappingRepository.java:324)
	at
org.apache.openjpa.meta.MetaDataRepository.preMapping(MetaDataRepository.java:662)
	at
org.apache.openjpa.meta.MetaDataRepository.resolve(MetaDataRepository.java:549)
	at
org.apache.openjpa.meta.MetaDataRepository.getMetaData(MetaDataRepository.java:308)
	at
org.apache.openjpa.meta.MetaDataRepository.getMetaData(MetaDataRepository.java:363)
	at org.apache.openjpa.kernel.QueryImpl.classForName(QueryImpl.java:1563)
	at
org.apache.openjpa.kernel.ExpressionStoreQuery$1.classForName(ExpressionStoreQuery.java:108)
	at
org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder.getClassMetaData(JPQLExpressionBuilder.java:168)
	at
org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder.resolveClassMetaData(JPQLExpressionBuilder.java:139)
	at
org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder.getCandidateMetaData(JPQLExpressionBuilder.java:225)
	at
org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder.getCandidateMetaData(JPQLExpressionBuilder.java:195)
	at
org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder.getCandidateType(JPQLExpressionBuilder.java:188)
	at
org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder.access$600(JPQLExpressionBuilder.java:69)
	at
org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder$ParsedJPQL.populate(JPQLExpressionBuilder.java:1754)
	at org.apache.openjpa.kernel.jpql.JPQLParser.populate(JPQLParser.java:56)
	at
org.apache.openjpa.kernel.ExpressionStoreQuery.populateFromCompilation(ExpressionStoreQuery.java:153)
	at org.apache.openjpa.kernel.QueryImpl.newCompilation(QueryImpl.java:657)
	at
org.apache.openjpa.kernel.QueryImpl.compilationFromCache(QueryImpl.java:638)
	at
org.apache.openjpa.kernel.QueryImpl.compileForCompilation(QueryImpl.java:604)
	at
org.apache.openjpa.kernel.QueryImpl.compileForExecutor(QueryImpl.java:666)
	at org.apache.openjpa.kernel.QueryImpl.compile(QueryImpl.java:573)
	at kodo.kernel.KodoQuery.compile(KodoQuery.java:75)
	at
org.apache.openjpa.persistence.EntityManagerImpl.createNamedQuery(EntityManagerImpl.java:892)
	at
org.apache.openjpa.persistence.EntityManagerImpl.createNamedQuery(EntityManagerImpl.java:77)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at
weblogic.deployment.BasePersistenceContextProxyImpl.invoke(BasePersistenceContextProxyImpl



My P.xml is a very simple one
  <persistence-unit name="pocDS" transaction-type="JTA">
    <jta-data-source>pocDS</jta-data-source>
    <properties>
    <property name="openjpa.jdbc.DBDictionary"
value="oracle(UseGetBytesForBlobs=true)"/>
    
    </properties>    
  </persistence-unit>
</persistence>


This works fine with actual table in database . Only view has this problem.
Is there any specific configuration required when working with view ?

Thanks in advance,

-- 
View this message in context: http://openjpa.208410.n2.nabble.com/Issue-with-ID-column-for-Database-view-as-Entity-EJB3-0-tp5237213p5237213.html
Sent from the OpenJPA Users mailing list archive at Nabble.com.

RE: Issue with ID column for Database view as Entity (EJB3.0)

Posted by Himadri <hi...@yahoo.co.in>.
Its working now with a bogus ID in VIEW only and NOT in EJB-Entity Bean . 
Changed the SQL to get a bogus id of type BIGINT. 
-- 
View this message in context: http://openjpa.208410.n2.nabble.com/Issue-with-ID-column-for-Database-view-as-Entity-EJB3-0-tp5237213p5277441.html
Sent from the OpenJPA Users mailing list archive at Nabble.com.

RE: Issue with ID column for Database view as Entity (EJB3.0)

Posted by Himadri <hi...@yahoo.co.in>.
Yeah I have checked that ..Its varchar2 in oracle database but somehow
openjpa interpret it as BIGINT .

tried with columnDefination but same result.  Basically I want id of one of
the table used in view. So finally I changed column name from id to
PropertyID. But now its a new exception 

 org.apache.openjpa.lib.jdbc.ReportingSQLException: [BEA][Oracle JDBC
Driver][Oracle]ORA-00904: "T0"."ID": invalid identifier
 {prepstmnt 4839 SELECT t0.id, t0.BOOLEANVALUE_F,
t0.DEFAULTPROPERTYVALUE_REF, t0.DOUBLEVALUE_F, t0.INTVALUE_F,
t0.MAXIMUMPROPERTYVALUE_REF, t0.MINIMUMPROPERTYVALUE_REF, t0.NAME_F,
t0.OBJECTID_F, t0.OBJECTTYPE_F, t0.PropertyID, t0.STRINGVALUE_F,
t0.TIMEVALUE_F FROM Property_V t0 WHERE (t0.NAME_F = ?) [params=(String)
USERNAME]} [code=904, state=42S22]
	at
org.apache.openjpa.util.Exceptions.replaceNestedThrowables(Exceptions.java:249)
	at
org.apache.openjpa.persistence.PersistenceException.writeObject(PersistenceException.java:100)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)


Entity looks like this now 

@Column(name="PropertyID" , columnDefinition="VARCHAR2(64)"
,nullable=false,length=64 )
	public String propertyID ;
	public String getPropertyID() {
		return this.propertyID;
	}

& DB view is 

CREATE OR REPLACE FORCE VIEW "XYZ"."PROPERTY_V" ("NAME_F", "VALUETYPE_F",
"MINIMUMPROPERTYVALUE_REF", "DEFAULTPROPERTYVALUE_REF",
"MAXIMUMPROPERTYVALUE_REF", "OBJECTID_F", "OBJECTTYPE_F", "STRINGVALUE_F",
"BOOLEANVALUE_F", "TIMEVALUE_F", "DOUBLEVALUE_F", "INTVALUE_F",
"PROPERTYID") AS 
  SELECT 
    PROPERTY_T.NAME_F NAME_F, 
    PROPERTY_T.VALUETYPE_F VALUETYPE_F, 
    PROPERTY_T.MINIMUMPROPERTYVALUE_REF MINIMUMPROPERTYVALUE_REF, 
    PROPERTY_T.DEFAULTPROPERTYVALUE_REF DEFAULTPROPERTYVALUE_REF, 
    PROPERTY_T.MAXIMUMPROPERTYVALUE_REF MAXIMUMPROPERTYVALUE_REF, 
    PROPERTYVALUE_T.OBJECTID_F OBJECTID_F, 
    PROPERTYVALUE_T.OBJECTTYPE_F OBJECTTYPE_F, 
    PROPERTYVALUE_T.STRINGVALUE_F STRINGVALUE_F, 
    PROPERTYVALUE_T.BOOLEANVALUE_F BOOLEANVALUE_F, 
    PROPERTYVALUE_T.TIMEVALUE_F TIMEVALUE_F, 
    PROPERTYVALUE_T.DOUBLEVALUE_F DOUBLEVALUE_F, 
    PROPERTYVALUE_T.INTVALUE_F INTVALUE_F, 
    PROPERTY_T.ID PropertyID 
FROM 
    PROPERTY_T, 
    PROPERTYVALUE_T 
WHERE 
    PROPERTYVALUE_T.PROPERTY_REF = PROPERTY_T.ID;
 
-- 
View this message in context: http://openjpa.208410.n2.nabble.com/Issue-with-ID-column-for-Database-view-as-Entity-EJB3-0-tp5237213p5242161.html
Sent from the OpenJPA Users mailing list archive at Nabble.com.

RE: Issue with ID column for Database view as Entity (EJB3.0)

Posted by C N Davies <cn...@cndavies.com>.
The exception says it wants a varchar, but your view is returning a big int,
have you checked that?

You might need to specify the column type :

@Column(name="ID", columnDefinition="VARCHAR")

Chris

-----Original Message-----
From: Himadri [mailto:hima_das@yahoo.co.in] 
Sent: Wednesday, 30 June 2010 3:01 PM
To: users@openjpa.apache.org
Subject: Issue with ID column for Database view as Entity (EJB3.0)


Hi,

My requirement is to use a database view as EJB3.0 Entity. I suppose this
doesnt need any extra effort. table name tag is db view name instead of
table name. This is how it looks like 

@Entity
@Table(name="Property_V")
@NamedQueries({
@NamedQuery(name="findPropsByName" ,query="Select o from PropertyView o
where o.name = :a"),
})
public class PropertyView extends PropertyViewBean {}


I have only getter methods in Entity and no setters. The issue comes only
when I declare ID column in entity.
	@Column(name="ID")
	public String id ;
	public String getId() {
		return this.id; 
	}

Its varchar2 in oracle database but somehow openjpa interpret it as BIGINT
and throws me below ! This is coming when I try to call the namedquery. 

javax.ejb.EJBException: EJB Exception: ; nested exception is: 
	<openjpa-0.0.0-rnull fatal user error>
org.apache.openjpa.persistence.ArgumentException:
"com.sample.magic.poc.domain.PropertyViewBean.id" declares a column that is
not compatible with the expected type "varchar".  Column details:
Full Name: Property_V.id
Type: bigint
Size: 0
Default: null
Not Null: true

	at
weblogic.ejb.container.internal.RemoteBusinessIntfProxy.unwrapRemoteExceptio
n(RemoteBusinessIntfProxy.java:105)
	at
weblogic.ejb.container.internal.RemoteBusinessIntfProxy.invoke(RemoteBusines
sIntfProxy.java:87)
	at $Proxy0.getProperties(Unknown Source)
	at test.junit.TestSample.testView(TestSample.java:67)
	at test.junit.TestSample.main(TestSample.java:26)
Caused by: <openjpa-0.0.0-rnull fatal user error>
org.apache.openjpa.persistence.ArgumentException:
"com.tieto.magic.poc.domain.PropertyViewBean.id" declares a column that is
not compatible with the expected type "varchar".  Column details:
Full Name: Property_V.id
Type: bigint
Size: 0
Default: null
Not Null: true

	at
org.apache.openjpa.jdbc.meta.MappingInfo.mergeColumn(MappingInfo.java:659)
	at
org.apache.openjpa.jdbc.meta.MappingInfo.createColumns(MappingInfo.java:518)
	at
org.apache.openjpa.jdbc.meta.ValueMappingInfo.getColumns(ValueMappingInfo.ja
va:143)
	at
org.apache.openjpa.jdbc.meta.strats.StringFieldStrategy.map(StringFieldStrat
egy.java:79)
	at
org.apache.openjpa.jdbc.meta.FieldMapping.setStrategy(FieldMapping.java:120)
	at
org.apache.openjpa.jdbc.meta.RuntimeStrategyInstaller.installStrategy(Runtim
eStrategyInstaller.java:80)
	at
org.apache.openjpa.jdbc.meta.FieldMapping.resolveMapping(FieldMapping.java:4
38)
	at
org.apache.openjpa.jdbc.meta.FieldMapping.resolve(FieldMapping.java:403)
	at
org.apache.openjpa.jdbc.meta.ClassMapping.resolveNonRelationMappings(ClassMa
pping.java:851)
	at
org.apache.openjpa.jdbc.meta.MappingRepository.prepareMapping(MappingReposit
ory.java:324)
	at
org.apache.openjpa.meta.MetaDataRepository.preMapping(MetaDataRepository.jav
a:662)
	at
org.apache.openjpa.meta.MetaDataRepository.resolve(MetaDataRepository.java:5
49)
	at
org.apache.openjpa.meta.MetaDataRepository.getMetaData(MetaDataRepository.ja
va:308)
	at
org.apache.openjpa.meta.MetaDataRepository.getMetaData(MetaDataRepository.ja
va:363)
	at
org.apache.openjpa.kernel.QueryImpl.classForName(QueryImpl.java:1563)
	at
org.apache.openjpa.kernel.ExpressionStoreQuery$1.classForName(ExpressionStor
eQuery.java:108)
	at
org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder.getClassMetaData(JPQLEx
pressionBuilder.java:168)
	at
org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder.resolveClassMetaData(JP
QLExpressionBuilder.java:139)
	at
org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder.getCandidateMetaData(JP
QLExpressionBuilder.java:225)
	at
org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder.getCandidateMetaData(JP
QLExpressionBuilder.java:195)
	at
org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder.getCandidateType(JPQLEx
pressionBuilder.java:188)
	at
org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder.access$600(JPQLExpressi
onBuilder.java:69)
	at
org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder$ParsedJPQL.populate(JPQ
LExpressionBuilder.java:1754)
	at
org.apache.openjpa.kernel.jpql.JPQLParser.populate(JPQLParser.java:56)
	at
org.apache.openjpa.kernel.ExpressionStoreQuery.populateFromCompilation(Expre
ssionStoreQuery.java:153)
	at
org.apache.openjpa.kernel.QueryImpl.newCompilation(QueryImpl.java:657)
	at
org.apache.openjpa.kernel.QueryImpl.compilationFromCache(QueryImpl.java:638)
	at
org.apache.openjpa.kernel.QueryImpl.compileForCompilation(QueryImpl.java:604
)
	at
org.apache.openjpa.kernel.QueryImpl.compileForExecutor(QueryImpl.java:666)
	at org.apache.openjpa.kernel.QueryImpl.compile(QueryImpl.java:573)
	at kodo.kernel.KodoQuery.compile(KodoQuery.java:75)
	at
org.apache.openjpa.persistence.EntityManagerImpl.createNamedQuery(EntityMana
gerImpl.java:892)
	at
org.apache.openjpa.persistence.EntityManagerImpl.createNamedQuery(EntityMana
gerImpl.java:77)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39
)
	at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl
.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at
weblogic.deployment.BasePersistenceContextProxyImpl.invoke(BasePersistenceCo
ntextProxyImpl



My P.xml is a very simple one
  <persistence-unit name="pocDS" transaction-type="JTA">
    <jta-data-source>pocDS</jta-data-source>
    <properties>
    <property name="openjpa.jdbc.DBDictionary"
value="oracle(UseGetBytesForBlobs=true)"/>
    
    </properties>    
  </persistence-unit>
</persistence>


This works fine with actual table in database . Only view has this problem.
Is there any specific configuration required when working with view ?

Thanks in advance,

--
View this message in context:
http://openjpa.208410.n2.nabble.com/Issue-with-ID-column-for-Database-view-a
s-Entity-EJB3-0-tp5237213p5237213.html
Sent from the OpenJPA Users mailing list archive at Nabble.com.