Author: fancy
Date: Sat Aug 21 15:46:49 2010
New Revision: 987773
URL: http://svn.apache.org/viewvc?rev=987773&view=rev
Log:
OPENJPA-1736: Mappings with foreign keys as identity fields sometimes not
resolved correctly
Added:
openjpa/branches/2.0.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/identity/entityasidentity2/
openjpa/branches/2.0.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/identity/entityasidentity2/Attendance.java
openjpa/branches/2.0.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/identity/entityasidentity2/Course.java
openjpa/branches/2.0.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/identity/entityasidentity2/Person.java
openjpa/branches/2.0.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/identity/entityasidentity2/Student.java
openjpa/branches/2.0.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/identity/entityasidentity2/TestEntityAsIdentityFields2.java
Removed:
openjpa/branches/2.0.x/openjpa-kernel/src/main/java/org/apache/openjpa/meta/InheritanceOrderedMetaDataList.java
Modified:
openjpa/branches/2.0.x/openjpa-kernel/src/main/java/org/apache/openjpa/conf/Compatibility.java
openjpa/branches/2.0.x/openjpa-kernel/src/main/java/org/apache/openjpa/meta/MetaDataRepository.java
openjpa/branches/2.0.x/openjpa-kernel/src/main/resources/org/apache/openjpa/meta/localizer.properties
openjpa/branches/2.0.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/identity/entityasidentity/TestEntityAsIdentityFields.java
Modified:
openjpa/branches/2.0.x/openjpa-kernel/src/main/java/org/apache/openjpa/conf/Compatibility.java
URL:
http://svn.apache.org/viewvc/openjpa/branches/2.0.x/openjpa-kernel/src/main/java/org/apache/openjpa/conf/Compatibility.java?rev=987773&r1=987772&r2=987773&view=diff
==============================================================================
---
openjpa/branches/2.0.x/openjpa-kernel/src/main/java/org/apache/openjpa/conf/Compatibility.java
(original)
+++
openjpa/branches/2.0.x/openjpa-kernel/src/main/java/org/apache/openjpa/conf/Compatibility.java
Sat Aug 21 15:46:49 2010
@@ -64,7 +64,6 @@ public class Compatibility {
private boolean _superclassDiscriminatorStrategyByDefault = true;
private boolean _isAbstractMappingUniDirectional = false;
private boolean _isNonDefaultMappingAllowed = false;
- private boolean _reorderMetaDataResolution = true;
private boolean _reloadOnDetach = false;
private boolean _ignoreDetachedStateFieldForProxySerialization = false;
@@ -508,26 +507,6 @@ public class Compatibility {
public boolean isNonDefaultMappingAllowed() {
return _isNonDefaultMappingAllowed;
}
-
- /**
- * Whether OpenJPA should reorder entities in
MetaDataRepository.processBuffer() to ensure that the metadata for
- * entities with foreign keys in their identity are processed after the
entities it depends on.
- *
- * @return true if the reordering should be performed, false if not.
- */
- public boolean getReorderMetaDataResolution() {
- return _reorderMetaDataResolution;
- }
-
- /**
- * Whether OpenJPA should reorder entities in
MetaDataRepository.processBuffer() to ensure that the metadata for
- * entities with foreign keys in their identity are processed after the
entities it depends on.
- *
- * @param reorderProcessBuffer true if the reordering should be performed,
false if not.
- */
- public void setReorderMetaDataResolution(boolean reorderProcessBuffer) {
- _reorderMetaDataResolution = reorderProcessBuffer;
- }
/**
* Whether OpenJPA should attempt to load fields when the DetachState
Modified:
openjpa/branches/2.0.x/openjpa-kernel/src/main/java/org/apache/openjpa/meta/MetaDataRepository.java
URL:
http://svn.apache.org/viewvc/openjpa/branches/2.0.x/openjpa-kernel/src/main/java/org/apache/openjpa/meta/MetaDataRepository.java?rev=987773&r1=987772&r2=987773&view=diff
==============================================================================
---
openjpa/branches/2.0.x/openjpa-kernel/src/main/java/org/apache/openjpa/meta/MetaDataRepository.java
(original)
+++
openjpa/branches/2.0.x/openjpa-kernel/src/main/java/org/apache/openjpa/meta/MetaDataRepository.java
Sat Aug 21 15:46:49 2010
@@ -141,8 +141,8 @@ public class MetaDataRepository implemen
private final Collection<Class<?>> _registered = new HashSet<Class<?>>();
// set of metadatas we're in the process of resolving
- private final InheritanceOrderedMetaDataList _resolving = new
InheritanceOrderedMetaDataList();
- private final InheritanceOrderedMetaDataList _mapping = new
InheritanceOrderedMetaDataList();
+ private final List<ClassMetaData> _resolving = new
ArrayList<ClassMetaData>();
+ private final List<ClassMetaData> _mapping = new
ArrayList<ClassMetaData>();
private final List<RuntimeException> _errs = new
LinkedList<RuntimeException>();
// system listeners
@@ -152,8 +152,6 @@ public class MetaDataRepository implemen
protected boolean _preloadComplete = false;
protected boolean _locking = true;
private static final String PRELOAD_STR = "Preload";
-
- private boolean _reorderMetaDataResolution = false;
/**
* Default constructor. Configure via {...@link Configurable}.
@@ -770,22 +768,28 @@ public class MetaDataRepository implemen
/**
* Process the given metadata and the associated buffer.
*/
- private List<ClassMetaData> processBuffer(ClassMetaData meta,
InheritanceOrderedMetaDataList buffer, int mode) {
+ private List<ClassMetaData> processBuffer(ClassMetaData meta,
List<ClassMetaData> buffer, int mode) {
+ // add the metadata to the buffer unless an instance for the same
entity
+ // is already there
+ for (ClassMetaData cmd : buffer)
+ if (cmd.getDescribedType().equals(meta.getDescribedType()))
+ return null;
+
// if we're already processing a metadata, just buffer this one; when
// the initial metadata finishes processing, we traverse the buffer
// and process all the others that were introduced during reentrant
// calls
- if (!buffer.add(meta) || buffer.size() != 1)
+ buffer.add(meta);
+ if (buffer.size() != 1)
return null;
// continually pop a metadata and process it until we run out; note
// that each processing call might place more metas in the buffer as
- // one class tries to access metadata for another; also note that the
- // buffer orders itself from least to most derived
+ // one class tries to access metadata for another
ClassMetaData buffered;
List<ClassMetaData> processed = new ArrayList<ClassMetaData>(5);
while (!buffer.isEmpty()) {
- buffered = buffer.peek();
+ buffered = buffer.get(0);
try {
buffered.resolve(mode);
processed.add(buffered);
@@ -808,11 +812,6 @@ public class MetaDataRepository implemen
}
}
- // Check if process buffer reordering for PCTypes that have
relationships to other PCTypes in their identity
- // should be performed.
- if (_reorderMetaDataResolution) {
- processed = resolveFKInPKDependenciesOrdering(processed);
- }
return processed;
}
@@ -1844,7 +1843,6 @@ public class MetaDataRepository implemen
public void setConfiguration(Configuration conf) {
_conf = (OpenJPAConfiguration) conf;
_log = _conf.getLog(OpenJPAConfiguration.LOG_METADATA);
- _reorderMetaDataResolution =
_conf.getCompatibilityInstance().getReorderMetaDataResolution();
}
public void startConfiguration() {
@@ -2413,196 +2411,6 @@ public class MetaDataRepository implemen
public XMLFieldMetaData newXMLFieldMetaData(Class<?> type, String name) {
return new XMLFieldMetaData(type, name);
}
-
- /**
- * Analyzes the list of ClassMetaData in the supplied list for any which
has foreign keys to other ClassMetaData
- * instances in its identity (in other words, PCTypes which have primary
keys that are foreign keys to other
- * tables), and returns a list arranged so that a ClassMetaData that
depends on another ClassMetaData appears
- * after it in the list.
- *
- * @param cmdList - List of ClassMetaData to examine
- * @return - List of ClassMetaData, with ClassMetaData dependees moved
after the last identified dependent
- * ClassMetaData, if any move is necessary.
- */
- private List<ClassMetaData>
resolveFKInPKDependenciesOrdering(List<ClassMetaData> cmdList) {
- HashMap<ClassMetaData, CMDDependencyNode> nodeMap = new
HashMap<ClassMetaData, CMDDependencyNode>();
- HashSet<CMDDependencyNode> nodesWithDependenciesSet = new
HashSet<CMDDependencyNode>();
- ArrayList<CMDDependencyNode> nodeList = new
ArrayList<CMDDependencyNode>(cmdList.size());
-
- // Initial analysis of ClassMetaData objects -- Populate the linked
list with objects in the same order of
- // appearance in the original list. Identify CMDs whose identities
have a FK to another CMD, and catalog that
- // dependency.
- for (ClassMetaData cmd : cmdList) {
- // Add this node to the list
- CMDDependencyNode node = nodeMap.get(cmd);
- if (node == null) {
- node = new CMDDependencyNode(cmd);
- nodeMap.put(cmd, node);
- }
- nodeList.add(node);
-
- // Examine its primary key fields, flag any references to another
PCType that is defined in cmdList as a
- // dependency
- FieldMetaData[] fmdArr = cmd.getPrimaryKeyFields();
- for (FieldMetaData fmd : fmdArr) {
- ValueMetaData vmd = fmd.getValue();
- if (vmd.isTypePC()) {
- ClassMetaData targetCMD = vmd.getDeclaredTypeMetaData();
-
- // Only process entries which are in the cmdList, as we
don't want to be adding anything new.
- if (!cmdList.contains(targetCMD)) {
- continue;
- }
-
- // Register the dependency
- CMDDependencyNode targetNode = null;
- if ((targetNode = nodeMap.get(targetCMD)) == null) {
- targetNode = new CMDDependencyNode(targetCMD);
- nodeMap.put(targetCMD, targetNode);
- }
- node.registerDependentNode(targetNode);
- nodesWithDependenciesSet.add(node);
- }
- }
- }
-
- // Analysis is complete. For each CMD that has an identity foreign key
dependency on another CMD, ensure that it
- // appears later in the list then the CMD it is dependent on. If it
appears earlier, move it immediately after
- // the CMD. If there are multiple CMDs the identity is dependent on,
move it after the last dependency in
- // the linked list.
- for (CMDDependencyNode node : nodesWithDependenciesSet) {
- // Check if there is a cycle (dependencies or subdependencies that
create a cycle in the graph. If one is
- // detected, then this algorithm cannot be used to reorder the CMD
list. Emit a warning, and return the
- // original list.
- if (node.checkForCycle()) {
- if (_log.isWarnEnabled()) {
- _log.warn(_loc.get("cmd-discover-cycle",
node.getCmd().getResourceName()));
- }
- return cmdList;
- }
-
- int nodeIndex = nodeList.indexOf(node);
- Set<CMDDependencyNode> dependencies = node.getDependsOnSet();
-
- // If the current node has a dependency that appears later in the
list, then this node needs
- // to be moved to the point immediately after that dependency.
- CMDDependencyNode moveAfter = null;
- int moveAfterIndex = -1;
- for (CMDDependencyNode depNode : dependencies) {
- int dependencyIndex = nodeList.indexOf(depNode);
- if ((nodeIndex < dependencyIndex) && (moveAfterIndex <
dependencyIndex)) {
- moveAfter = depNode;
- moveAfterIndex = dependencyIndex;
- }
- }
- if (moveAfter != null) {
- nodeList.remove(nodeIndex);
- nodeList.add(nodeList.indexOf(moveAfter) + 1, node);
- }
- }
-
- // Sorting is complete, build the return list. Clear the dependsOnSet
for the GC.
- ArrayList<ClassMetaData> returnList = new ArrayList<ClassMetaData>();
- for (CMDDependencyNode current : nodeList) {
- returnList.add(current.getCmd());
- current.getDependsOnSet().clear();
- }
-
- return returnList;
- }
-
-
- /**
- * Linked list node class for managing any foreign keys in the identity of
a ClassMetaData instance.
- *
- */
- private class CMDDependencyNode {
- private ClassMetaData cmd;
-
- // Marker for quick determination if this node has dependencies
- private boolean hasDependencies = false;
-
- // List of ClassMetaData objects this ClassMetaData depends on
- private HashSet<CMDDependencyNode> dependsOnSet = new
HashSet<CMDDependencyNode>();
-
- /**
- * Inner class constructor
- */
- CMDDependencyNode(ClassMetaData cmd) {
- this.cmd = cmd;
- }
-
- /**
- * Returns the ClassMetaData instance referenced by this node.
- */
- public ClassMetaData getCmd() {
- return cmd;
- }
-
- /**
- *
- * @return true if this node's ClassMetaData has a FK in its identity
that refers to another ClassMetaData;
- * false if it does not.
- */
- public boolean getHasDependencies() {
- return hasDependencies;
- }
-
- /**
- * Registers a ClassMetaData modelled by a CMDDependencyNode as a
dependency of this ClassMetaData.
- *
- */
- public void registerDependentNode(CMDDependencyNode node) {
- getDependsOnSet().add(node);
- hasDependencies = true;
- }
-
- /**
- * Returns a Set containing all of the CMDDependencyNode instances
that this node has a FK in identity
- * dependency on.
- *
- */
- public Set<CMDDependencyNode> getDependsOnSet() {
- return dependsOnSet;
- }
-
- /**
- * Checks all dependencies, and sub-dependencies, for any cycles in
the dependency graph.
- *
- * @return true if a cycle was discovered, false if not.
- */
- public boolean checkForCycle() {
- java.util.Stack<CMDDependencyNode> visitStack = new
java.util.Stack<CMDDependencyNode>();
- return internalCheckForCycle(visitStack);
- }
-
- /**
- * Internal implementation of the cycle detection.
- *
- * @param visitStack
- * @return true if a cycle is detected, false if no cycle was detected.
- */
- private boolean
internalCheckForCycle(java.util.Stack<CMDDependencyNode> visitStack) {
- if (visitStack.contains(this)) {
- return true;
- }
- visitStack.push(this);
-
- try {
- for (CMDDependencyNode node : dependsOnSet) {
- if (node.getHasDependencies()) {
- if (node.internalCheckForCycle(visitStack) == true) {
- return true;
- }
- }
- }
- } finally {
- visitStack.pop();
- }
-
- return false;
- }
- }
public static boolean needsPreload(Options o) {
if (o.getBooleanProperty(PRELOAD_STR) == true) {
Modified:
openjpa/branches/2.0.x/openjpa-kernel/src/main/resources/org/apache/openjpa/meta/localizer.properties
URL:
http://svn.apache.org/viewvc/openjpa/branches/2.0.x/openjpa-kernel/src/main/resources/org/apache/openjpa/meta/localizer.properties?rev=987773&r1=987772&r2=987773&view=diff
==============================================================================
---
openjpa/branches/2.0.x/openjpa-kernel/src/main/resources/org/apache/openjpa/meta/localizer.properties
(original)
+++
openjpa/branches/2.0.x/openjpa-kernel/src/main/resources/org/apache/openjpa/meta/localizer.properties
Sat Aug 21 15:46:49 2010
@@ -348,9 +348,6 @@ repos-preload-none: No persistent metada
repos-preloading: Following metadata are being loaded during initialization by
"{0}": {1}.
repos-preload-error: Unexpected error during early loading during
initialization. \
See nested stacktrace for details.
-cmd-discover-cycle: A cycle was detected while resolving the identity \
- references for type "{0}". The original process buffer ordering \
- will be used.
repos-initializeEager-none: No persistent metadata found for loading during
initialization. \
The persistent classes must be listed in persistence unit configuration to
be loaded during initialization.
repos-initializeEager-found: The following classes are being preloaded "{0}".
Modified:
openjpa/branches/2.0.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/identity/entityasidentity/TestEntityAsIdentityFields.java
URL:
http://svn.apache.org/viewvc/openjpa/branches/2.0.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/identity/entityasidentity/TestEntityAsIdentityFields.java?rev=987773&r1=987772&r2=987773&view=diff
==============================================================================
---
openjpa/branches/2.0.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/identity/entityasidentity/TestEntityAsIdentityFields.java
(original)
+++
openjpa/branches/2.0.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/identity/entityasidentity/TestEntityAsIdentityFields.java
Sat Aug 21 15:46:49 2010
@@ -28,9 +28,7 @@ import org.apache.openjpa.persistence.te
public class TestEntityAsIdentityFields extends SingleEMFTestCase {
public void setUp() {
- setUp(
- Account.class, AccountGroup.class, Person.class,
- "openjpa.Compatibility", "reorderMetaDataResolution=true");
+ setUp(Account.class, AccountGroup.class, Person.class);
}
/**
Added:
openjpa/branches/2.0.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/identity/entityasidentity2/Attendance.java
URL:
http://svn.apache.org/viewvc/openjpa/branches/2.0.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/identity/entityasidentity2/Attendance.java?rev=987773&view=auto
==============================================================================
---
openjpa/branches/2.0.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/identity/entityasidentity2/Attendance.java
(added)
+++
openjpa/branches/2.0.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/identity/entityasidentity2/Attendance.java
Sat Aug 21 15:46:49 2010
@@ -0,0 +1,65 @@
+/*
+ * 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.identity.entityasidentity2;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.IdClass;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+
+...@entity
+...@table(name = "EAI2Attendance")
+...@idclass(Attendance.AttendanceId.class)
+public class Attendance {
+
+ public static class AttendanceId {
+
+ private int student;
+ private int course;
+
+ public AttendanceId() {}
+
+ public AttendanceId(int studentId, int courseId) {
+ this.student = studentId;
+ this.course = courseId;
+ }
+
+ public String toString() {
+ return student + ":" + course;
+ }
+
+ public int hashCode() {
+ return (17 + student) * 37 + course;
+ }
+
+ public boolean equals(Object other) {
+ return this == other
+ || other instanceof AttendanceId
+ && student == ((AttendanceId) other).student
+ && course == ((AttendanceId) other).course;
+ }
+ }
+
+ @Id @ManyToOne
+ Student student;
+
+ @Id @ManyToOne
+ Course course;
+}
Added:
openjpa/branches/2.0.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/identity/entityasidentity2/Course.java
URL:
http://svn.apache.org/viewvc/openjpa/branches/2.0.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/identity/entityasidentity2/Course.java?rev=987773&view=auto
==============================================================================
---
openjpa/branches/2.0.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/identity/entityasidentity2/Course.java
(added)
+++
openjpa/branches/2.0.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/identity/entityasidentity2/Course.java
Sat Aug 21 15:46:49 2010
@@ -0,0 +1,37 @@
+/*
+ * 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.identity.entityasidentity2;
+
+import java.util.Collection;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+
+...@entity
+...@table(name = "EAI2Course")
+public class Course {
+
+ @Id
+ int id;
+
+ @OneToMany(mappedBy = "course")
+ Collection<Attendance> attendances;
+}
Added:
openjpa/branches/2.0.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/identity/entityasidentity2/Person.java
URL:
http://svn.apache.org/viewvc/openjpa/branches/2.0.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/identity/entityasidentity2/Person.java?rev=987773&view=auto
==============================================================================
---
openjpa/branches/2.0.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/identity/entityasidentity2/Person.java
(added)
+++
openjpa/branches/2.0.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/identity/entityasidentity2/Person.java
Sat Aug 21 15:46:49 2010
@@ -0,0 +1,31 @@
+/*
+ * 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.identity.entityasidentity2;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+...@entity
+...@table(name = "EAI2Person")
+public class Person {
+
+ @Id
+ int id;
+}
Added:
openjpa/branches/2.0.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/identity/entityasidentity2/Student.java
URL:
http://svn.apache.org/viewvc/openjpa/branches/2.0.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/identity/entityasidentity2/Student.java?rev=987773&view=auto
==============================================================================
---
openjpa/branches/2.0.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/identity/entityasidentity2/Student.java
(added)
+++
openjpa/branches/2.0.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/identity/entityasidentity2/Student.java
Sat Aug 21 15:46:49 2010
@@ -0,0 +1,38 @@
+/*
+ * 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.identity.entityasidentity2;
+
+import java.util.Collection;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+import javax.persistence.OneToOne;
+import javax.persistence.Table;
+
+...@entity
+...@table(name = "EAI2Student")
+public class Student {
+
+ @Id @OneToOne
+ Person person;
+
+ @OneToMany(mappedBy = "student")
+ Collection<Attendance> attendances;
+}
Added:
openjpa/branches/2.0.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/identity/entityasidentity2/TestEntityAsIdentityFields2.java
URL:
http://svn.apache.org/viewvc/openjpa/branches/2.0.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/identity/entityasidentity2/TestEntityAsIdentityFields2.java?rev=987773&view=auto
==============================================================================
---
openjpa/branches/2.0.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/identity/entityasidentity2/TestEntityAsIdentityFields2.java
(added)
+++
openjpa/branches/2.0.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/identity/entityasidentity2/TestEntityAsIdentityFields2.java
Sat Aug 21 15:46:49 2010
@@ -0,0 +1,40 @@
+/*
+ * 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.identity.entityasidentity2;
+
+import javax.persistence.EntityManager;
+import javax.persistence.Query;
+
+import org.apache.openjpa.persistence.test.SingleEMFTestCase;
+
+public class TestEntityAsIdentityFields2 extends SingleEMFTestCase {
+
+ public void setUp() {
+ setUp(Attendance.class, Course.class, Person.class, Student.class);
+ }
+
+ public void testEntityAsIdentityField001() {
+ EntityManager em = emf.createEntityManager();
+
+ Query query = em.createQuery("select p from Person p");
+ query.getResultList();
+
+ em.close();
+ }
+}