You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by fa...@apache.org on 2009/10/23 00:52:41 UTC
svn commit: r828889 - in /openjpa/trunk:
openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/
openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/
openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/
openjpa-persis...
Author: faywang
Date: Thu Oct 22 22:52:39 2009
New Revision: 828889
URL: http://svn.apache.org/viewvc?rev=828889&view=rev
Log:
OPENJPA-871: support JoinColumn in conjunction with MapsId annotation
Added:
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/enhance/identity/Line1.java (with props)
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/enhance/identity/LineId1.java (with props)
Modified:
openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/FieldMapping.java
openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/MappingInfo.java
openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/ValueMappingImpl.java
openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/ValueMappingInfo.java
openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/EmbedValueHandler.java
openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/ObjectIdValueHandler.java
openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/RelationFieldStrategy.java
openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/AnnotationPersistenceMappingParser.java
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/enhance/identity/Book1.java
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/enhance/identity/Library1.java
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/enhance/identity/Page1.java
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/enhance/identity/PageId1.java
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/enhance/identity/TestMultipleLevelDerivedIdentity1.java
Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/FieldMapping.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/FieldMapping.java?rev=828889&r1=828888&r2=828889&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/FieldMapping.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/FieldMapping.java Thu Oct 22 22:52:39 2009
@@ -92,6 +92,8 @@
private FieldMapping _bi_MTo1_JT_Field = null;
private ForeignKey _bi_1ToM_Join_FK = null;
private ForeignKey _bi_1ToM_Elem_FK = null;
+
+ private boolean _hasMapsIdCols = false;
/**
* Constructor.
@@ -1335,4 +1337,12 @@
public boolean isNonDefaultMappingUsingJoinTableStrategy() {
return isBi1To1JT() || isUni1To1JT() || isUniMTo1JT() || isBiMTo1JT();
}
+
+ public void setMapsIdCols(boolean hasMapsIdCols) {
+ _hasMapsIdCols = hasMapsIdCols;
+ }
+
+ public boolean hasMapsIdCols() {
+ return _hasMapsIdCols;
+ }
}
Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/MappingInfo.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/MappingInfo.java?rev=828889&r1=828888&r2=828889&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/MappingInfo.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/MappingInfo.java Thu Oct 22 22:52:39 2009
@@ -544,6 +544,10 @@
// n columns because we don't know which of the n columns the info
// applies to
List given = getColumns();
+
+ if (context instanceof FieldMapping && ((FieldMapping)context).hasMapsIdCols())
+ given = ((FieldMapping)context).getValueInfo().getMapsIdColumns();
+
boolean fill = ((MappingRepository) context.getRepository()).
getMappingDefaults().defaultMissingInfo();
if ((!given.isEmpty() || (!adapt && !fill))
Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/ValueMappingImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/ValueMappingImpl.java?rev=828889&r1=828888&r2=828889&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/ValueMappingImpl.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/ValueMappingImpl.java Thu Oct 22 22:52:39 2009
@@ -34,6 +34,7 @@
import org.apache.openjpa.kernel.OpenJPAStateManager;
import org.apache.openjpa.lib.util.Localizer;
import org.apache.openjpa.meta.JavaTypes;
+import org.apache.openjpa.meta.ValueMetaData;
import org.apache.openjpa.meta.ValueMetaDataImpl;
import org.apache.openjpa.util.InternalException;
import org.apache.openjpa.util.MetaDataException;
@@ -458,6 +459,11 @@
embed.syncMappingInfo();
}
}
+
+ public void copy(ValueMetaData vmd) {
+ super.copy(vmd);
+ copyMappingInfo((ValueMapping)vmd);
+ }
public void copyMappingInfo(ValueMapping vm) {
setValueMappedBy(vm.getValueMappedBy());
Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/ValueMappingInfo.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/ValueMappingInfo.java?rev=828889&r1=828888&r2=828889&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/ValueMappingInfo.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/ValueMappingInfo.java Thu Oct 22 22:52:39 2009
@@ -18,6 +18,7 @@
*/
package org.apache.openjpa.jdbc.meta;
+import java.util.Collections;
import java.util.List;
import org.apache.openjpa.jdbc.schema.Column;
@@ -47,6 +48,7 @@
private boolean _criteria = false;
private boolean _canNull = true;
+ private List _mapsIdCols = null;
/**
* Whether to use class criteria when joining to related type.
@@ -331,4 +333,18 @@
if (_canNull)
_canNull = vinfo.canIndicateNull();
}
+
+ /**
+ * Raw column data.
+ */
+ public List getMapsIdColumns() {
+ return (_mapsIdCols == null) ? Collections.EMPTY_LIST : _mapsIdCols;
+ }
+
+ /**
+ * Raw column data.
+ */
+ public void setMapsIdColumns(List cols) {
+ _mapsIdCols = cols;
+ }
}
Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/EmbedValueHandler.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/EmbedValueHandler.java?rev=828889&r1=828888&r2=828889&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/EmbedValueHandler.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/EmbedValueHandler.java Thu Oct 22 22:52:39 2009
@@ -283,7 +283,7 @@
Column[] pkCols = ((ValueMappingImpl)fmd.getValue()).getColumns();
for (int j = 0; j < pkCols.length; j++) {
Column newCol = new Column();
- newCol.setName(pkCols[j].getName());
+ newCol.copy(pkCols[j]);
cols.add(newCol);
}
}
Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/ObjectIdValueHandler.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/ObjectIdValueHandler.java?rev=828889&r1=828888&r2=828889&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/ObjectIdValueHandler.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/ObjectIdValueHandler.java Thu Oct 22 22:52:39 2009
@@ -23,6 +23,8 @@
import java.util.List;
import org.apache.openjpa.jdbc.kernel.JDBCStore;
+import org.apache.openjpa.jdbc.meta.ClassMapping;
+import org.apache.openjpa.jdbc.meta.FieldMapping;
import org.apache.openjpa.jdbc.meta.ValueMapping;
import org.apache.openjpa.jdbc.schema.Column;
import org.apache.openjpa.jdbc.schema.ColumnIO;
@@ -46,12 +48,92 @@
boolean adapt) {
List cols = new ArrayList();
List args = new ArrayList();
+ setMapsIdCol(vm);
super.map(vm, name, io, adapt, cols, args);
vm.setColumns((Column[]) cols.toArray(new Column[cols.size()]));
_args = args.toArray();
return vm.getColumns();
}
+
+ private void setMapsIdCol(ValueMapping vm) {
+ if (!(vm instanceof FieldMapping))
+ return;
+ if (!((FieldMapping)vm).hasMapsIdCols())
+ return;
+ ClassMapping embeddedMeta = (ClassMapping)((FieldMapping)vm).getValue().getEmbeddedMetaData();
+ if (embeddedMeta == null)
+ return;
+ List mapsIdColList = ((FieldMapping)vm).getValueInfo().getMapsIdColumns();
+ if (mapsIdColList.size() > 0 ) {
+ setMapsIdCols(mapsIdColList, embeddedMeta);
+ return;
+ }
+
+ FieldMapping[] fmds = embeddedMeta.getFieldMappings();
+ for (int i = 0; i < fmds.length; i++) {
+ mapsIdColList = fmds[i].getValueInfo().getMapsIdColumns();
+ if (mapsIdColList.size() == 0)
+ continue;
+ ClassMapping embeddedMeta1 = (ClassMapping)fmds[i].getEmbeddedMetaData();
+ if (embeddedMeta1 != null)
+ setMapsIdCols(mapsIdColList, embeddedMeta1);
+ else
+ setMapsIdCols(mapsIdColList, fmds[i]);
+ }
+ }
+
+ private void setMapsIdCols(List cols, ClassMapping cm) {
+ for (int i = 0; i < cols.size(); i++) {
+ String refColName = ((Column)cols.get(i)).getTarget();
+ FieldMapping fm = getReferenceField(cm, refColName);
+ if (fm != null) {
+ List colList1 = new ArrayList();
+ colList1.add(cols.get(i));
+ fm.setMapsIdCols(true);
+ fm.getValueInfo().setMapsIdColumns(colList1);
+ }
+ }
+ }
+
+ private void setMapsIdCols(List cols, FieldMapping fm) {
+ if (cols.size() == 1) {
+ fm.setMapsIdCols(true);
+ fm.getValueInfo().setMapsIdColumns(cols);
+ return;
+ }
+
+ for (int i = 0; i < cols.size(); i++) {
+ String refColName = ((Column)cols.get(i)).getTarget();
+ if (isReferenceField(fm, refColName)) {
+ List colList1 = new ArrayList();
+ colList1.add(cols.get(i));
+ fm.setMapsIdCols(true);
+ fm.getValueInfo().setMapsIdColumns(colList1);
+ }
+ }
+ }
+
+ private FieldMapping getReferenceField(ClassMapping cm, String refColName) {
+ FieldMapping[] fmds = cm.getFieldMappings();
+ for (int i = 0; i < fmds.length; i++) {
+ if (isReferenceField(fmds[i], refColName))
+ return fmds[i];
+ }
+ return null;
+ }
+
+ private boolean isReferenceField(FieldMapping fm, String refColName) {
+ List cols = fm.getValueInfo().getColumns();
+ if (cols.size() == 0) {
+ if (fm.getName().equals(refColName))
+ return true;
+ } else {
+ if (((Column)cols.get(0)).getName().equals(refColName))
+ return true;
+ }
+ return false;
+ }
public Object getResultArgument(ValueMapping vm) {
return _args;
Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/RelationFieldStrategy.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/RelationFieldStrategy.java?rev=828889&r1=828888&r2=828889&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/RelationFieldStrategy.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/RelationFieldStrategy.java Thu Oct 22 22:52:39 2009
@@ -200,7 +200,8 @@
FieldMapping fm = (FieldMapping) pks[i];
ValueMappingImpl val = (ValueMappingImpl) field.getValue();
ValueMappingInfo info = val.getValueInfo();
- info.setColumns(getMappedByIdColumns(fm));
+ if (info.getColumns().size() == 0)
+ info.setColumns(getMappedByIdColumns(fm));
}
}
Modified: openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/AnnotationPersistenceMappingParser.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/AnnotationPersistenceMappingParser.java?rev=828889&r1=828888&r2=828889&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/AnnotationPersistenceMappingParser.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/AnnotationPersistenceMappingParser.java Thu Oct 22 22:52:39 2009
@@ -1689,6 +1689,21 @@
setColumns(fm, info, cols, unique);
if (secondary != null)
fm.getMappingInfo().setTableName(secondary);
+ String mappedByIdValue = fm.getMappedByIdValue();
+ if (mappedByIdValue != null) {
+ FieldMapping[] pks = fm.getDefiningMapping().getPrimaryKeyFieldMappings();
+ pks[0].setMapsIdCols(true);
+ if (mappedByIdValue.length() == 0) {
+ pks[0].getValueInfo().setMapsIdColumns(cols);
+ } else {
+ ClassMapping embeddedMeta = (ClassMapping)pks[0].getValue().getEmbeddedMetaData();
+ if (embeddedMeta != null) {
+ FieldMapping fmd = embeddedMeta.getFieldMapping(mappedByIdValue);
+ if (fmd != null)
+ fmd.getValueInfo().setMapsIdColumns(cols);
+ }
+ }
+ }
}
/**
Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/enhance/identity/Book1.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/enhance/identity/Book1.java?rev=828889&r1=828888&r2=828889&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/enhance/identity/Book1.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/enhance/identity/Book1.java Thu Oct 22 22:52:39 2009
@@ -22,13 +22,17 @@
import java.util.HashSet;
import java.util.Set;
+import javax.persistence.AttributeOverride;
+import javax.persistence.AttributeOverrides;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
+import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.MapsId;
import javax.persistence.OneToMany;
+import javax.persistence.Table;
import org.apache.openjpa.persistence.jdbc.VersionColumn;
@@ -44,17 +48,22 @@
*
*/
@Entity
+@Table(name="DI_BOOK1")
@VersionColumn
public class Book1 implements Serializable {
@EmbeddedId
+ @AttributeOverrides({
+ @AttributeOverride(name="name", column=@Column(name="BOOK_NAME")),
+ @AttributeOverride(name="library", column=@Column(name="LIBRARY_NAME"))
+ })
private BookId1 bid;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "book")
private Set<Page1> pages = new HashSet<Page1>();
@MapsId("library")
- @Column(nullable = false)
@ManyToOne
+ @JoinColumn(name="LIBRARY_NAME", referencedColumnName="LIBRARY_NAME")
private Library1 library;
private String author;
Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/enhance/identity/Library1.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/enhance/identity/Library1.java?rev=828889&r1=828888&r2=828889&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/enhance/identity/Library1.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/enhance/identity/Library1.java Thu Oct 22 22:52:39 2009
@@ -26,6 +26,7 @@
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToMany;
+import javax.persistence.Table;
import org.apache.openjpa.persistence.jdbc.VersionColumn;
@@ -41,6 +42,7 @@
*
*/
@Entity
+@Table(name="DI_LIBRARY1")
@VersionColumn
public class Library1 implements Serializable {
@Id
Added: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/enhance/identity/Line1.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/enhance/identity/Line1.java?rev=828889&view=auto
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/enhance/identity/Line1.java (added)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/enhance/identity/Line1.java Thu Oct 22 22:52:39 2009
@@ -0,0 +1,82 @@
+/*
+ * 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.identity;
+
+import java.io.Serializable;
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.persistence.AttributeOverride;
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.EmbeddedId;
+import javax.persistence.Entity;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinColumns;
+import javax.persistence.ManyToOne;
+import javax.persistence.MapsId;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+
+import org.apache.openjpa.persistence.jdbc.VersionColumn;
+
+/**
+ * Entity used to test compound primary keys using entity as relationship to
+ * more than one level.
+ *
+ * Test case and domain classes were originally part of the reported issue
+ * <A href="https://issues.apache.org/jira/browse/OPENJPA-207">OPENJPA-207</A>
+ *
+ * @author Jeffrey Blattman
+ * @author Pinaki Poddar
+ *
+ */
+@Entity
+@Table(name="DI_LINE1")
+@VersionColumn
+public class Line1 implements Serializable {
+ @EmbeddedId
+ @AttributeOverride(name="lineNum", column=@Column(name="LINE_NUM"))
+ private LineId1 lid;
+
+ @MapsId("page")
+ @ManyToOne
+ @JoinColumns({
+ @JoinColumn(name="LIBRARY_NAME", referencedColumnName="LIBRARY_NAME"),
+ @JoinColumn(name="BOOK_NAME", referencedColumnName="BOOK_NAME"),
+ @JoinColumn(name="PAGE_NUM", referencedColumnName="PAGE_NUM")
+ })
+ private Page1 page;
+
+ public LineId1 getLid() {
+ return lid;
+ }
+
+ public void setLid(LineId1 lid) {
+ this.lid = lid;
+ }
+
+ public Page1 getPage() {
+ return page;
+ }
+
+ public void setPage(Page1 page) {
+ this.page = page;
+ }
+}
Propchange: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/enhance/identity/Line1.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/enhance/identity/LineId1.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/enhance/identity/LineId1.java?rev=828889&view=auto
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/enhance/identity/LineId1.java (added)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/enhance/identity/LineId1.java Thu Oct 22 22:52:39 2009
@@ -0,0 +1,95 @@
+/*
+ * 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.identity;
+
+import java.io.Serializable;
+
+import javax.persistence.AttributeOverride;
+import javax.persistence.AttributeOverrides;
+import javax.persistence.Column;
+import javax.persistence.Embeddable;
+import javax.persistence.Embedded;
+
+
+/**
+ * Entity identity used to test compound primary keys using entity as
+ * relationship to more than one level.
+ *
+ * Test case and domain classes were originally part of the reported issue
+ * <A href="https://issues.apache.org/jira/browse/OPENJPA-207">OPENJPA-207</A>
+ *
+ * @author Jeffrey Blattman
+ * @author Pinaki Poddar
+ *
+ */
+
+@Embeddable
+public final class LineId1 implements Serializable {
+ @Column(name="LINE_NUM")
+ private int lineNum;
+
+ @Embedded
+ @AttributeOverride(name="number", column=@Column(name="PAGE_NUM"))
+ private PageId1 page;
+
+ public LineId1() {}
+
+ public LineId1(int lineNum, PageId1 page) {
+ this.lineNum = lineNum;
+ this.page = page;
+ }
+
+ public int getLineNum() {
+ return lineNum;
+ }
+
+ public void setLineNum(int lineNum) {
+ this.lineNum = lineNum;
+ }
+
+ public boolean equals(Object o) {
+ if (!(o instanceof LineId1)) {
+ return false;
+ }
+
+ LineId1 other = (LineId1)o;
+
+ if (!(getLineNum() == other.getLineNum())) {
+ return false;
+ }
+
+ if (!getPage().equals(other.getPage())) {
+ return false;
+ }
+
+ return true;
+ }
+
+ public int hashCode() {
+ return lineNum * (page != null ? getPage().hashCode() : 31);
+ }
+
+ public PageId1 getPage() {
+ return page;
+ }
+
+ public void setPage(PageId1 page) {
+ this.page = page;
+ }
+}
Propchange: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/enhance/identity/LineId1.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/enhance/identity/Page1.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/enhance/identity/Page1.java?rev=828889&r1=828888&r2=828889&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/enhance/identity/Page1.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/enhance/identity/Page1.java Thu Oct 22 22:52:39 2009
@@ -19,7 +19,11 @@
package org.apache.openjpa.persistence.enhance.identity;
import java.io.Serializable;
+import java.util.HashSet;
+import java.util.Set;
+import javax.persistence.AttributeOverride;
+import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
@@ -27,6 +31,8 @@
import javax.persistence.JoinColumns;
import javax.persistence.ManyToOne;
import javax.persistence.MapsId;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
import org.apache.openjpa.persistence.jdbc.VersionColumn;
@@ -42,22 +48,24 @@
*
*/
@Entity
-
+@Table(name="DI_PAGE1")
@VersionColumn
public class Page1 implements Serializable {
@EmbeddedId
+ @AttributeOverride(name="number", column=@Column(name="PAGE_NUM"))
private PageId1 pid;
@MapsId("book")
- @Column(nullable = false)
@ManyToOne
@JoinColumns({
- @JoinColumn(name="BOOK_LIBRARY_LIBRARY_NAME",
- referencedColumnName="LIBRARY_LIBRARY_NAME"),
- @JoinColumn(name="BOOK_BOOK_NAME", referencedColumnName="BOOK_NAME")
+ @JoinColumn(name="LIBRARY_NAME", referencedColumnName="LIBRARY_NAME"),
+ @JoinColumn(name="BOOK_NAME", referencedColumnName="BOOK_NAME")
})
private Book1 book;
-
+
+ @OneToMany(cascade = CascadeType.ALL, mappedBy = "page")
+ private Set<Line1> lines = new HashSet<Line1>();
+
public PageId1 getPid() {
return pid;
}
@@ -73,4 +81,22 @@
public void setBook(Book1 book) {
this.book = book;
}
+
+ public Set<Line1> getLines() {
+ return lines;
+ }
+
+ public Line1 getLine(LineId1 lid) {
+ for (Line1 l: lines) {
+ if (l.getLid().equals(lid)) {
+ return l;
+ }
+ }
+ return null;
+ }
+
+ public void addLine(Line1 l) {
+ l.setPage(this);
+ lines.add(l);
+ }
}
Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/enhance/identity/PageId1.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/enhance/identity/PageId1.java?rev=828889&r1=828888&r2=828889&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/enhance/identity/PageId1.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/enhance/identity/PageId1.java Thu Oct 22 22:52:39 2009
@@ -20,6 +20,9 @@
import java.io.Serializable;
+import javax.persistence.AttributeOverride;
+import javax.persistence.AttributeOverrides;
+import javax.persistence.Column;
import javax.persistence.Embeddable;
import javax.persistence.Embedded;
@@ -39,7 +42,12 @@
@Embeddable
public final class PageId1 implements Serializable {
private int number;
+
@Embedded
+ @AttributeOverrides({
+ @AttributeOverride(name="name", column=@Column(name="BOOK_NAME")),
+ @AttributeOverride(name="library", column=@Column(name="LIBRARY_NAME"))
+ })
private BookId1 book;
public PageId1() {}
Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/enhance/identity/TestMultipleLevelDerivedIdentity1.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/enhance/identity/TestMultipleLevelDerivedIdentity1.java?rev=828889&r1=828888&r2=828889&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/enhance/identity/TestMultipleLevelDerivedIdentity1.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/enhance/identity/TestMultipleLevelDerivedIdentity1.java Thu Oct 22 22:52:39 2009
@@ -18,11 +18,13 @@
*/
package org.apache.openjpa.persistence.enhance.identity;
+import java.util.Arrays;
import java.util.List;
import javax.persistence.EntityManager;
-import org.apache.openjpa.persistence.test.SingleEMFTestCase;
+import org.apache.openjpa.persistence.jdbc.SQLSniffer;
+import org.apache.openjpa.persistence.test.SQLListenerTestCase;
/**
@@ -32,22 +34,25 @@
*
*/
@SuppressWarnings("unchecked")
-public class TestMultipleLevelDerivedIdentity1 extends SingleEMFTestCase {
+public class TestMultipleLevelDerivedIdentity1 extends SQLListenerTestCase {
private static String LIBRARY_NAME = "LIB";
private static String BOOK_NAME = "foo";
private static int NUM_PAGES = 3;
+ private static int NUM_LINES = 20;
public void setUp() throws Exception {
- super.setUp(CLEAR_TABLES, Library1.class, Book1.class, Page1.class,
- BookId1.class, PageId1.class,
+ super.setUp(DROP_TABLES, Library1.class, Book1.class, Page1.class,
+ BookId1.class, PageId1.class, Line1.class, LineId1.class,
"openjpa.RuntimeUnenhancedClasses", "unsupported");
create();
}
public void testPersist() {
+ sql.clear();
create();
}
public void testQueryRootLevel() {
+ sql.clear();
EntityManager em = emf.createEntityManager();
List<Library1> list = em.createQuery("SELECT p FROM Library1 p")
.getResultList();
@@ -62,6 +67,7 @@
}
public void testQueryIntermediateLevel() {
+ sql.clear();
EntityManager em = emf.createEntityManager();
List<Book1> list = em.createQuery("SELECT p FROM Book1 p")
.getResultList();
@@ -80,6 +86,7 @@
}
public void testQueryLeafLevel() {
+ sql.clear();
EntityManager em = emf.createEntityManager();
List<Page1> list = em.createQuery("SELECT p FROM Page1 p")
.getResultList();
@@ -95,6 +102,7 @@
}
public void testFindRootNode() {
+ sql.clear();
EntityManager em = emf.createEntityManager();
Library1 lib = em.find(Library1.class, LIBRARY_NAME);
assertNotNull(lib);
@@ -106,6 +114,7 @@
}
public void testFindIntermediateNode() {
+ sql.clear();
EntityManager em = emf.createEntityManager();
BookId1 bookId = new BookId1();
@@ -116,6 +125,7 @@
}
public void testFindLeafNode() {
+ sql.clear();
EntityManager em = emf.createEntityManager();
BookId1 bookId = new BookId1();
@@ -129,6 +139,7 @@
}
public void testUpdate() {
+ sql.clear();
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
BookId1 bookId = new BookId1();
@@ -141,6 +152,7 @@
}
public void testDeleteRoot() {
+ sql.clear();
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
Library1 lib = em.find(Library1.class, LIBRARY_NAME);
@@ -153,6 +165,7 @@
}
public void testDeleteLeafObtainedByQuery() {
+ sql.clear();
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
Page1 page = (Page1)em.createQuery(
@@ -168,6 +181,7 @@
}
public void testDeleteLeafObtainedByFind() {
+ sql.clear();
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
BookId1 bookId = new BookId1();
@@ -212,10 +226,36 @@
PageId1 pid = new PageId1(i, bid);
page.setPid(pid);
book.addPage(page);
+ for (int j = 1; j <= NUM_LINES; j++) {
+ Line1 line = new Line1();
+ LineId1 lid = new LineId1(j, pid);
+ line.setLid(lid);
+ page.addLine(line);
+
+ }
}
em.persist(lib);
em.getTransaction().commit();
em.clear();
+ assertSQLFragnments(sql, "CREATE TABLE DI_LIBRARY1", "LIBRARY_NAME");
+ assertSQLFragnments(sql, "CREATE TABLE DI_BOOK1", "LIBRARY_NAME", "BOOK_NAME");
+ assertSQLFragnments(sql, "CREATE TABLE DI_PAGE1", "LIBRARY_NAME", "BOOK_NAME", "PAGE_NUM");
+ assertSQLFragnments(sql, "CREATE TABLE DI_LINE1", "LIBRARY_NAME", "BOOK_NAME", "PAGE_NUM", "LINE_NUM");
}
+
+ void assertSQLFragnments(List<String> list, String... keys) {
+ if (SQLSniffer.matches(list, keys))
+ return;
+ fail("None of the following " + sql.size() + " SQL \r\n" +
+ toString(sql) + "\r\n contains all keys \r\n"
+ + toString(Arrays.asList(keys)));
+ }
+
+ public String toString(List<String> list) {
+ StringBuffer buf = new StringBuffer();
+ for (String s : list)
+ buf.append(s).append("\r\n");
+ return buf.toString();
+ }
}