[maven-release-plugin] copy for tag openjpa-parent-2.3.0
git-svn-id: https://svn.apache.org/repos/asf/openjpa/tags/openjpa-parent-2.3.0@1540826 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/PessimisticLockManager.java b/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/PessimisticLockManager.java
index 51e2503..401129b 100644
--- a/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/PessimisticLockManager.java
+++ b/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/PessimisticLockManager.java
@@ -101,13 +101,12 @@
protected void lockInternal(OpenJPAStateManager sm, int level, int timeout,
Object sdata, boolean postVersionCheck) {
// we can skip any already-locked instance regardless of level because
- // we treat all locks the same (though super doesn't)
- if (getLockLevel(sm) == LOCK_NONE) {
- // only need to lock if not loaded from locking result
- ConnectionInfo info = (ConnectionInfo) sdata;
- if (info == null || info.result == null || !info.result.isLocking())
- lockRow(sm, timeout, level);
- }
+ // we treat all locks the same (though super doesn't).
+
+ // only need to lock if not loaded from locking result
+ ConnectionInfo info = (ConnectionInfo) sdata;
+ if (info == null || info.result == null || !info.result.isLocking())
+ lockRow(sm, timeout, level);
optimisticLockInternal(sm, level, timeout, sdata, postVersionCheck);
}
@@ -128,7 +127,9 @@
Object id = sm.getObjectId();
ClassMapping mapping = (ClassMapping) sm.getMetaData();
- List<SQLBuffer> sqls = getLockRows(dict, id, mapping, fetch, _store.getSQLFactory());
+ List<SQLBuffer> sqls = sm.getLock() == null
+ ? getLockRows(dict, id, mapping, fetch, _store.getSQLFactory())
+ : new ArrayList<SQLBuffer>();
if (ctx.getFetchConfiguration().getLockScope() == LockScopes.LOCKSCOPE_EXTENDED)
lockJoinTables(sqls, dict, id, mapping, fetch, _store.getSQLFactory());
diff --git a/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/RelationToManyInverseKeyFieldStrategy.java b/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/RelationToManyInverseKeyFieldStrategy.java
index d7b7ea5..abe3e91 100644
--- a/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/RelationToManyInverseKeyFieldStrategy.java
+++ b/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/RelationToManyInverseKeyFieldStrategy.java
@@ -327,8 +327,7 @@
if (sm != null && sm.isDeleted())
sm = null;
writeable = io.isAnyUpdatable(fk, sm == null);
- orderWriteable = field.getOrderColumnIO().isUpdatable
- (order, sm == null);
+ orderWriteable = field.getOrderColumnIO().isUpdatable(order, sm == null);
action = Row.ACTION_UPDATE;
}
if (!writeable && !orderWriteable)
@@ -345,8 +344,11 @@
// update the inverse pointer with our oid value
if (writeable)
row.setForeignKey(fk, io, sm);
- if (orderWriteable)
+
+ if (orderWriteable) {
+ // set the OrderColumn value
row.setInt(order, idx);
+ }
}
public Object toDataStoreValue(Object val, JDBCStore store) {
diff --git a/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/PrimaryRow.java b/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/PrimaryRow.java
index 230fcf8..fd04152 100644
--- a/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/PrimaryRow.java
+++ b/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/PrimaryRow.java
@@ -331,43 +331,50 @@
boolean overrideDefault)
throws SQLException {
// make sure we're not setting two different values
- // unless the given column is an implicit relationship and value
- // changes from logical default to non-default
+ // unless the given column is an implicit relationship and value
+ // changes from logical default to non-default
Object prev = getSet(col);
if (prev != null) {
if (prev == NULL)
prev = null;
if (!rowValueEquals(prev, val)) {
- if (isDefaultValue(prev) || allowsUpdate(col, prev, val)) {
- super.setObject(col, val, metaType, overrideDefault);
- } else if (!isDefaultValue(prev)) {
- throw new InvalidStateException(_loc.get("diff-values",
- new Object[]{ col.getFullDBIdentifier().getName(),
- (prev == null) ? null : prev.getClass(), prev,
- (val == null) ? null : val.getClass(), val })).
- setFatal(true);
- } else {
- // since not allow to update and the new value is 0 or null,
- // just return.
- return;
- }
+ if (isDefaultValue(prev) || allowsUpdate(col, prev, val)) {
+ super.setObject(col, val, metaType, overrideDefault);
+ return;
+ } else if (!isDefaultValue(val)) {
+ throw new InvalidStateException(_loc.get("diff-values",
+ new Object[]{ col.getFullDBIdentifier().getName(),
+ (prev == null) ? null : prev.getClass(), prev,
+ (val == null) ? null : val.getClass(), val })).
+ setFatal(true);
+ } else {
+ // since not allow to update and the new value is 0 or null,
+ // just return.
+ return;
+ }
}
}
super.setObject(col, val, metaType, overrideDefault);
}
/**
- * Allow the given column value to be updated only if old or current value
- * is a default value or was not set and the column is not a primary key.
+ * Allow the given key column value to be updated if the old value is a default value
+ * or the new value is default.
+ * For primary keys we even disallow setting the current value to default
*/
boolean allowsUpdate(Column col, Object old, Object cur) {
- return ((!col.isPrimaryKey() && col.isImplicitRelation()) ||
- col.isUni1MFK()) && (isDefaultValue(old));
+ if (col.isPrimaryKey() && isDefaultValue(old) && !isDefaultValue(cur)) {
+ // for primary keys we disallow re-setting it to default
+ return false;
+ }
+
+ return !(col.isPrimaryKey() || col.isRelationId() || col.isImplicitRelation() || col.isUni1MFK())
+ || isDefaultValue(old) || isDefaultValue(cur);
}
boolean isDefaultValue(Object val) {
- return val == null || val == NULL
- || (val instanceof Number && ((Number)val).longValue() == 0);
+ return val == null || val == NULL
+ || (val instanceof Number && ((Number)val).longValue() == 0);
}
/**
diff --git a/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/StateManagerImpl.java b/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/StateManagerImpl.java
index e11fefb..e8f03dd 100644
--- a/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/StateManagerImpl.java
+++ b/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/StateManagerImpl.java
@@ -1381,9 +1381,9 @@
if (fetch == null)
fetch = _broker.getFetchConfiguration();
- if (_readLockLevel == -1)
+ if (_readLockLevel == -1 || _readLockLevel < fetch.getReadLockLevel())
_readLockLevel = fetch.getReadLockLevel();
- if (_writeLockLevel == -1)
+ if (_writeLockLevel == -1 || _writeLockLevel < fetch.getWriteLockLevel())
_writeLockLevel = fetch.getWriteLockLevel();
return (forWrite) ? _writeLockLevel : _readLockLevel;
}
diff --git a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/TestOpenJPA2330.java b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/TestOpenJPA2330.java
index 45e41e6..db5cc13 100644
--- a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/TestOpenJPA2330.java
+++ b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/TestOpenJPA2330.java
@@ -21,11 +21,14 @@
import javax.persistence.EntityManager;
import javax.persistence.spi.LoadState;
+import junit.framework.Assert;
import org.apache.openjpa.persistence.entity.EntityA;
import org.apache.openjpa.persistence.entity.EntityB;
import org.apache.openjpa.persistence.entity.EntityC;
import org.apache.openjpa.persistence.test.SingleEMFTestCase;
+import java.util.Iterator;
+
/**
*
*/
@@ -55,4 +58,50 @@
em.close();
}
+
+ public void testOpenJPA2335() {
+ EntityManager em = emf.createEntityManager();
+
+ em.getTransaction().begin();
+ EntityA a = new EntityA();
+
+ EntityB b1 = new EntityB(a);
+ b1.setName("b1");
+ a.getBs().add(b1);
+
+ EntityB b2 = new EntityB(a);
+ b2.setName("b2");
+ a.getBs().add(b2);
+
+ EntityB b3 = new EntityB(a);
+ b3.setName("b3");
+ a.getBs().add(b3);
+
+ EntityB b4 = new EntityB(a);
+ b4.setName("b4");
+ a.getBs().add(b4);
+
+ em.persist(a);
+
+ em.getTransaction().commit();
+ em.close();
+
+ // now read all back in
+ em = emf.createEntityManager();
+ em.getTransaction().begin();
+ EntityA a2 = em.find(EntityA.class, a.getId());
+ Assert.assertNotNull(a2);
+ Assert.assertNotNull(a2.getBs());
+ Assert.assertEquals(4, a2.getBs().size());
+
+ Iterator<EntityB> it = a2.getBs().iterator();
+ for (int i = 1; i <= 4; i++) {
+ EntityB entityB = it.next();
+
+ Assert.assertEquals("b" + i, entityB.getName());
+ }
+
+ em.getTransaction().commit();
+ em.close();
+ }
}
diff --git a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/Course.java b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/Course.java
index 576073a..74e23c3 100644
--- a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/Course.java
+++ b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/Course.java
@@ -29,7 +29,6 @@
@Entity
@Table(name="CR_CRSE")
-
public class Course {
@Id
@GeneratedValue
diff --git a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/entity/EntityA.java b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/entity/EntityA.java
index 7dca955..2257d82 100644
--- a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/entity/EntityA.java
+++ b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/entity/EntityA.java
@@ -42,7 +42,7 @@
private String name;
@OneToMany(fetch = FetchType.EAGER, mappedBy = "center", orphanRemoval = true, cascade = CascadeType.ALL)
- @OrderColumn
+ @OrderColumn(name="POSITION")
private Set<EntityB> services = new LinkedHashSet<EntityB>();
public EntityA() {
diff --git a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/entity/EntityB.java b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/entity/EntityB.java
index bd3c286..943aead 100644
--- a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/entity/EntityB.java
+++ b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/entity/EntityB.java
@@ -22,6 +22,7 @@
import java.util.Set;
import javax.persistence.CascadeType;
+import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
diff --git a/openjpa-project/pom.xml b/openjpa-project/pom.xml
index 3c20eb0..7bdcd65 100644
--- a/openjpa-project/pom.xml
+++ b/openjpa-project/pom.xml
@@ -179,6 +179,13 @@
<configuration>
<siteDirectory>target/filtered-site</siteDirectory>
</configuration>
+ <dependencies>
+ <dependency><!-- add support for ssh/scp -->
+ <groupId>org.apache.maven.wagon</groupId>
+ <artifactId>wagon-ssh</artifactId>
+ <version>1.0</version>
+ </dependency>
+ </dependencies>
</plugin>
<plugin>