package org.tests.model.family; import io.ebean.annotation.Formula; import org.tests.model.basic.EBasic; import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.ManyToOne; @Entity public class ChildPerson extends InheritablePerson { private static final String PARENTS_JOIN = "join parent_person j1 on j1.identifier = ${ta}.parent_identifier " + "join grand_parent_person j2 on j2.identifier = j1.parent_identifier"; @ManyToOne(cascade = CascadeType.ALL) private ParentPerson parent; private String familyName; private String address; //@Coalesce({ "familyName", "parent.familyName", "parent.parent.familyName" }) @Formula(select = "coalesce(${ta}.family_name, j1.family_name, j2.family_name)", join = PARENTS_JOIN) private String effectiveFamilyName; //@Coalesce({ "address", "parent.address", "parent.parent.address" }) @Formula(select = "coalesce(${ta}.address, j1.address, j2.address)", join = PARENTS_JOIN) private String effectiveAddress; @Formula(select = "coalesce(${ta}.some_bean_id, j1.some_bean_id, j2.some_bean_id)") @ManyToOne private EBasic effectiveBean; public ParentPerson getParent() { return parent; } public void setParent(ParentPerson parent) { this.parent = parent; } public String getFamilyName() { return familyName; } public void setFamilyName(String familyName) { this.familyName = familyName; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getEffectiveFamilyName() { return effectiveFamilyName; } public String getEffectiveAddress() { return effectiveAddress; } public EBasic getEffectiveBean() { return effectiveBean; } }