From 9f19ed53760e222818a0b3a5a3e1dc0f49279d70 Mon Sep 17 00:00:00 2001 From: rob bygrave Date: Mon, 1 Jul 2019 00:07:14 +1200 Subject: [PATCH] #1743 - When using @PrimaryKeyJoinColumn, FK constraint generation cannot be disabled --- .../build/ModelBuildPropertyVisitor.java | 12 ++++++--- .../server/deploy/BeanDescriptorManager.java | 3 +-- .../server/deploy/BeanPropertyAssocOne.java | 5 +++- .../server/deploy/TableJoin.java | 26 ++++++++++++------- .../org/tests/model/onetoone/OtoUPrime.java | 5 +++- 5 files changed, 34 insertions(+), 17 deletions(-) diff --git a/src/main/java/io/ebeaninternal/dbmigration/model/build/ModelBuildPropertyVisitor.java b/src/main/java/io/ebeaninternal/dbmigration/model/build/ModelBuildPropertyVisitor.java index fa7950b45..94650eeec 100644 --- a/src/main/java/io/ebeaninternal/dbmigration/model/build/ModelBuildPropertyVisitor.java +++ b/src/main/java/io/ebeaninternal/dbmigration/model/build/ModelBuildPropertyVisitor.java @@ -256,9 +256,15 @@ public class ModelBuildPropertyVisitor extends BaseTablePropertyVisitor { } TableJoin primaryKeyJoin = p.getBeanDescriptor().getPrimaryKeyJoin(); if (primaryKeyJoin != null && !table.isPartitioned()) { - TableJoinColumn[] columns = primaryKeyJoin.columns(); - col.setReferences(primaryKeyJoin.getTable() + "." + columns[0].getForeignDbColumn()); - col.setForeignKeyName(determineForeignKeyConstraintName(col.getName())); + final PropertyForeignKey foreignKey = primaryKeyJoin.getForeignKey(); + if (foreignKey == null || !foreignKey.isNoConstraint()) { + TableJoinColumn[] columns = primaryKeyJoin.columns(); + col.setReferences(primaryKeyJoin.getTable() + "." + columns[0].getForeignDbColumn()); + col.setForeignKeyName(determineForeignKeyConstraintName(col.getName())); + if (foreignKey != null) { + col.setForeignKeyModes(foreignKey.getOnDelete(), foreignKey.getOnUpdate()); + } + } } } else { col.setDefaultValue(p.getDbColumnDefault()); diff --git a/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorManager.java b/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorManager.java index 6c2ab9114..cca2e4e7e 100644 --- a/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorManager.java +++ b/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorManager.java @@ -1654,8 +1654,7 @@ public class BeanDescriptorManager implements BeanDescriptorMap { String baseTable = prop.getDesc().getBaseTable(); DeployTableJoin inverse = prop.getTableJoin().createInverse(baseTable); - TableJoin inverseJoin = new TableJoin(inverse); - + TableJoin inverseJoin = new TableJoin(inverse, prop.getForeignKey()); DeployBeanInfo target = deployInfoMap.get(prop.getTargetType()); target.setPrimaryKeyJoin(inverseJoin); } diff --git a/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocOne.java b/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocOne.java index c2cc6c843..23ba314cf 100644 --- a/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocOne.java +++ b/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocOne.java @@ -45,6 +45,7 @@ public class BeanPropertyAssocOne extends BeanPropertyAssoc implements STr private final boolean orphanRemoval; private final boolean primaryKeyExport; + private final boolean primaryKeyJoin; private AssocOneHelp localHelp; @@ -75,6 +76,7 @@ public class BeanPropertyAssocOne extends BeanPropertyAssoc implements STr super(descriptor, deploy); primaryKeyExport = deploy.isPrimaryKeyExport(); + primaryKeyJoin = deploy.isPrimaryKeyJoin(); oneToOne = deploy.isOneToOne(); oneToOneExported = deploy.isOneToOneExported(); orphanRemoval = deploy.isOrphanRemoval(); @@ -100,6 +102,7 @@ public class BeanPropertyAssocOne extends BeanPropertyAssoc implements STr public BeanPropertyAssocOne(BeanPropertyAssocOne source, BeanPropertyOverride override) { super(source, override); primaryKeyExport = source.primaryKeyExport; + primaryKeyJoin = source.primaryKeyJoin; oneToOne = source.oneToOne; oneToOneExported = source.oneToOneExported; orphanRemoval = source.orphanRemoval; @@ -357,7 +360,7 @@ public class BeanPropertyAssocOne extends BeanPropertyAssoc implements STr } public boolean hasForeignKey() { - return foreignKey == null || !foreignKey.isNoConstraint(); + return foreignKey == null || primaryKeyJoin || !foreignKey.isNoConstraint(); } public boolean hasForeignKeyIndex() { diff --git a/src/main/java/io/ebeaninternal/server/deploy/TableJoin.java b/src/main/java/io/ebeaninternal/server/deploy/TableJoin.java index 03cb35d6c..5d805aa20 100644 --- a/src/main/java/io/ebeaninternal/server/deploy/TableJoin.java +++ b/src/main/java/io/ebeaninternal/server/deploy/TableJoin.java @@ -33,11 +33,17 @@ public final class TableJoin { */ private final int queryHash; + private final PropertyForeignKey foreignKey; + + public TableJoin(DeployTableJoin deploy) { + this(deploy, null); + } + /** * Create a TableJoin. */ - public TableJoin(DeployTableJoin deploy) { - + public TableJoin(DeployTableJoin deploy, PropertyForeignKey foreignKey) { + this.foreignKey = foreignKey; this.table = InternString.intern(deploy.getTable()); this.type = deploy.getType(); this.inheritInfo = deploy.getInheritInfo(); @@ -52,6 +58,7 @@ public final class TableJoin { } private TableJoin(TableJoin source, String overrideColumn) { + this.foreignKey = null; this.table = source.table; this.type = source.type; this.inheritInfo = source.inheritInfo; @@ -96,14 +103,6 @@ public final class TableJoin { return true; } - - /** - * Return a hash value for adding to a query plan. - */ - public int queryHash() { - return queryHash; - } - @Override public String toString() { StringBuilder sb = new StringBuilder(30); @@ -114,6 +113,13 @@ public final class TableJoin { return sb.toString(); } + /** + * Return the foreign key options. + */ + public PropertyForeignKey getForeignKey() { + return foreignKey; + } + /** * Return the join columns. */ diff --git a/src/test/java/org/tests/model/onetoone/OtoUPrime.java b/src/test/java/org/tests/model/onetoone/OtoUPrime.java index 4b2bd894b..a8da23578 100644 --- a/src/test/java/org/tests/model/onetoone/OtoUPrime.java +++ b/src/test/java/org/tests/model/onetoone/OtoUPrime.java @@ -1,5 +1,7 @@ package org.tests.model.onetoone; +import io.ebean.annotation.DbForeignKey; + import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.OneToOne; @@ -21,6 +23,7 @@ public class OtoUPrime { */ @OneToOne @PrimaryKeyJoinColumn + @DbForeignKey(noConstraint = true) OtoUPrimeExtra extra; @Version @@ -32,7 +35,7 @@ public class OtoUPrime { @Override public String toString() { - return "id:"+ pid +" name:"+name+" extra:"+extra; + return "id:" + pid + " name:" + name + " extra:" + extra; } public UUID getPid() {