diff --git a/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancer.java b/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancer.java index 6af248705..0af06fe59 100644 --- a/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancer.java +++ b/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancer.java @@ -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,13 +2587,12 @@ public class PCEnhancer { // new (); 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); - }else { + code.invokevirtual().setMethod(PRE + "GetIDOwningClass", Class.class, null); + } else { code.classconstant().setClass(getType(_meta)); } } diff --git a/openjpa-kernel/src/main/resources/org/apache/openjpa/enhance/localizer.properties b/openjpa-kernel/src/main/resources/org/apache/openjpa/enhance/localizer.properties index 507e93715..1cd1facfa 100644 --- a/openjpa-kernel/src/main/resources/org/apache/openjpa/enhance/localizer.properties +++ b/openjpa-kernel/src/main/resources/org/apache/openjpa/enhance/localizer.properties @@ -214,4 +214,5 @@ temp-file-creation: The temporary file "{0}" was created and it may not get \ get-field: Error while getting value of field {1} from instance {0} by reflection. 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. +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. diff --git a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/enhance/TestEmbeddableEntityWithIDAnnotation.java b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/enhance/TestEmbeddableEntityWithIDAnnotation.java new file mode 100644 index 000000000..4df20df89 --- /dev/null +++ b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/enhance/TestEmbeddableEntityWithIDAnnotation.java @@ -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(); + } + } + +} diff --git a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/enhance/common/apps/EmbeddableEntityWithIDAnnotation.java b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/enhance/common/apps/EmbeddableEntityWithIDAnnotation.java new file mode 100644 index 000000000..8ff76ebf1 --- /dev/null +++ b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/enhance/common/apps/EmbeddableEntityWithIDAnnotation.java @@ -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; + } + +} diff --git a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/enhance/common/apps/IDOwningClassTestEntity.java b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/enhance/common/apps/IDOwningClassTestEntity.java new file mode 100644 index 000000000..544236f19 --- /dev/null +++ b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/enhance/common/apps/IDOwningClassTestEntity.java @@ -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; + +}