OPENJPA-2233: Failed to invoke pcGetIDOwningClass method on embeddable entity with ID annotation

git-svn-id: https://svn.apache.org/repos/asf/openjpa/branches/2.0.x@1389523 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Jody Grassel 2012-09-24 19:26:23 +00:00
parent 7a528a03e4
commit 290f0aeccb
5 changed files with 198 additions and 7 deletions

View File

@ -1150,6 +1150,11 @@ public class PCEnhancer {
if (_meta.hasAbstractPKField() == true) {
addGetIDOwningClass();
}
if (_meta.isEmbeddedOnly() && _meta.getIdentityType() == ClassMetaData.ID_APPLICATION) {
_log.error(_loc.get("ID-field-in-embeddable-unsupported", _meta.toString()));
}
addNewObjectIdInstanceMethod(true);
addNewObjectIdInstanceMethod(false);
}
@ -2582,12 +2587,11 @@ public class PCEnhancer {
// new <oid class> ();
code.anew().setType(oidType);
code.dup();
if (_meta.isOpenJPAIdentity() || (obj && usesClsString ==
Boolean.TRUE)) {
if(_meta.isEmbeddedOnly() || _meta.hasAbstractPKField() == true ) {
if (_meta.isOpenJPAIdentity() || (obj && usesClsString == Boolean.TRUE)) {
if ((_meta.isEmbeddedOnly() && ! (_meta.getIdentityType() == ClassMetaData.ID_APPLICATION))
|| _meta.hasAbstractPKField() == true ) {
code.aload().setThis();
code.invokevirtual().setMethod(PRE + "GetIDOwningClass",
Class.class, null);
code.invokevirtual().setMethod(PRE + "GetIDOwningClass", Class.class, null);
} else {
code.classconstant().setClass(getType(_meta));
}

View File

@ -215,3 +215,4 @@ get-field: Error while getting value of field {1} from instance {0} by reflectio
get-method: Error while getting value by getter method {1} on instance {0} by reflection.
set-field: Error while setting value {2} of {3} on field {1} of instance {0} by reflection.
set-method: Error while setting value {2} of {3} by setter method {1} of instance {0} by reflection.
ID-field-in-embeddable-unsupported: The identity field defined in the embeddable entity {0} is not supported.

View File

@ -0,0 +1,49 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.openjpa.persistence.enhance;
import javax.persistence.EntityManager;
import org.apache.openjpa.persistence.enhance.common.apps.EmbeddableEntityWithIDAnnotation;
import org.apache.openjpa.persistence.enhance.common.apps.IDOwningClassTestEntity;
import org.apache.openjpa.persistence.test.SQLListenerTestCase;
public class TestEmbeddableEntityWithIDAnnotation extends SQLListenerTestCase{
public void setUp() {
setUp(EmbeddableEntityWithIDAnnotation.class, IDOwningClassTestEntity.class, CLEAR_TABLES);
}
//make sure no exception is thrown here.
public void testpcNewObjectIdInstanceMethod(){
EntityManager em = emf.createEntityManager();
try{
IDOwningClassTestEntity e = new IDOwningClassTestEntity();
em.getTransaction().begin();
em.persist(e);
em.getTransaction().commit();
assertTrue(em.createQuery("select count(c) from IDOwningClassTestEntity c", Long.class)
.getSingleResult().longValue() > 0);
}finally{
em.close();
}
}
}

View File

@ -0,0 +1,105 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.openjpa.persistence.enhance.common.apps;
// default package
import javax.persistence.Column;
import javax.persistence.Embeddable;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
/**
* BillingNoteId entity. @author MyEclipse Persistence Tools
*/
@Embeddable
public class EmbeddableEntityWithIDAnnotation implements java.io.Serializable
{
private static final long serialVersionUID = 558333273831654654L;
private Long id;
private Long seqNo = new Long(2012);
public EmbeddableEntityWithIDAnnotation( )
{
}
public EmbeddableEntityWithIDAnnotation( Long id, Long seqNo )
{
this.id = id;
this.seqNo = seqNo;
}
// Property accessors
@Id
@Column(unique=true, nullable=false, precision=12, scale=0)
public Long getId()
{
return this.id;
}
public void setId( Long id )
{
this.id = id;
}
@Column( name = "EmbeddableEntitySeqNo", nullable = false, precision = 12, scale = 0 )
public Long getSeqNo()
{
return this.seqNo;
}
public void setSeqNo( Long seqNo )
{
this.seqNo = seqNo;
}
public boolean equals( Object other )
{
if ( ( this == other ) )
return true;
if ( ( other == null ) )
return false;
if ( !( other instanceof EmbeddableEntityWithIDAnnotation ) )
return false;
EmbeddableEntityWithIDAnnotation castOther = ( EmbeddableEntityWithIDAnnotation ) other;
return ( ( this.getId( ) == castOther.getId( ) )
|| ( this.getId( ) != null && castOther.getId( ) != null
&& this.getId( ).equals( castOther.getId( ) ) ) )
&& ( ( this.getSeqNo( ) == castOther.getSeqNo( ) )
|| ( this.getSeqNo( ) != null && castOther.getSeqNo( ) != null
&& this.getSeqNo( ).equals( castOther.getSeqNo( ) ) ) );
}
public int hashCode()
{
int result = 17;
result = 37 * result + ( getId( ) == null ? 0 : this.getId( ).hashCode( ) );
result = 37 * result + ( getSeqNo( ) == null ? 0 : this.getSeqNo( ).hashCode( ) );
return result;
}
}

View File

@ -0,0 +1,32 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.openjpa.persistence.enhance.common.apps;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
@Entity
public class IDOwningClassTestEntity {
@EmbeddedId
EmbeddableEntityWithIDAnnotation pk = new EmbeddableEntityWithIDAnnotation(new Long(2012), new Long(2000));
String name;
}