FIX: improved support for @DbForeignKey(noConstraint = true) (#1527)

* FIX: improved support for DbForeignKey(noConstraint = true)

* FIX: Tests for mariadb and sqlserver

* FIX: SqlServer was still incorrect

* FIX: not ommit property for formula

* Update BeanDescriptor.java (typo fix)

fix typo column (no code change!)
This commit is contained in:
Roland Praml
2018-11-13 20:44:45 +13:00
committed by Rob Bygrave
parent 3c6a52da31
commit ce403e72a7
13 changed files with 931 additions and 11 deletions
@@ -1,5 +1,6 @@
package io.ebeaninternal.server.query;
import io.ebean.bean.EntityBean;
import io.ebeaninternal.server.type.ScalarType;
public interface STreePropertyAssocOne extends STreePropertyAssoc {
@@ -13,4 +14,14 @@ public interface STreePropertyAssocOne extends STreePropertyAssoc {
* Return the scalar type of the associated id property.
*/
ScalarType<?> getIdScalarType();
/**
* Returns true, if this relation has a foreign key.
*/
boolean hasForeignKey();
/**
* Return the property value as an entity bean from the parent.
*/
public EntityBean getValueAsEntityBean(EntityBean parentBean);
}
@@ -132,5 +132,13 @@ public interface STreeType {
*/
void inheritanceLoad(SqlBeanLoad sqlBeanLoad, STreeProperty property, DbReadContext ctx);
/**
* Mark the bean as deleted by setting the softDelete property to true.
*
* This works also, if there is only a virtual softDelete property computed by a formula.
*
* If there is no softdelete property, it sets the lazyLoadFailure flag in EBI.
*/
void markAsDeleted(EntityBean bean);
}
@@ -498,8 +498,11 @@ public final class SqlTreeBuilder {
for (STreePropertyAssocOne propertyAssocOne : desc.propsOne()) {
//noinspection StatementWithEmptyBody
if (queryProps != null && queryProps.isIncludedBeanJoin(propertyAssocOne.getName())) {
// if it is a joined bean... then don't add the property
if (queryProps != null
&& queryProps.isIncludedBeanJoin(propertyAssocOne.getName())
&& propertyAssocOne.hasForeignKey()
&& !propertyAssocOne.isFormula()) {
// if it is a joined bean with FK constraint... then don't add the property
// as it will have its own entire Node in the SqlTree
} else {
selectProps.add(propertyAssocOne);
@@ -266,6 +266,14 @@ class SqlTreeNodeBean implements SqlTreeNode {
if (id == null) {
// bean must be null...
localBean = null;
// ... but there may exist as reference bean in parent which has to be marked as deleted.
if (parentBean != null && nodeBeanProp instanceof STreePropertyAssocOne) {
contextBean = ((STreePropertyAssocOne)nodeBeanProp).getValueAsEntityBean(parentBean);
if (contextBean != null) {
desc.markAsDeleted(contextBean);
}
}
} else if (!temporalVersions) {
// check the PersistenceContext to see if the bean already exists
contextBean = (EntityBean) localDesc.contextPutIfAbsent(persistenceContext, id, localBean);