2011-10-21 3 views
1

je donne les résultats suivants "haut niveau" (parent) entités de domaine:Grails/Gorm soutien autre entité mère 1 - De nombreuses associations

clients
Société
Contactez

Et l'enfant suivant entité:

Adresse

Il y a un à plusieurs entre chacun des t op entités de domaine de premier niveau:

clients -> Adresse
Société -> Adresse
Contact -> Adresse

dire un client, une entreprise ou un contact peut avoir une ou plusieurs adresses.

Malheureusement, je ne sais pas comment modéliser cela dans les grails/gorm. Il semble que je ne peux définir un parent ou d'une déclaration belongsTo Adresse à-dire je ne suis pas en mesure de déclarer Adresse en utilisant:

Address { 
    Customer parent //?? 
    Company parent //?? 
    Contact parent //?? 
} 

Quelqu'un peut-il me dire si je manque quelque chose ou s'il est possible de définir ce type de relation une manière supportée?

Merci,

Cowper

+0

Peut-être lié: http://stackoverflow.com/questions/5533305/grails-belongsto-cascade-on-delete-when-belongsto -specifies-multiple-classes –

Répondre

3

Vous devriez être en mesure d'utiliser la version du tableau de belongsTo comme Tim a souligné:

Address { 
    static belongsTo = [Customer, Company, Contact] 
} 

Si les entités peuvent partager une adresse commune peut changer la façon dont vous configurer les suppressions.

Une autre option est d'avoir ces trois classes inherit the property from a superclass, mais si oui ou non ce sens dans votre cas, je ne sais pas (il ne sorte de ressemble pas).

+1

Je préfère généralement l'approche de la carte statique belongsTo = [client: Client, société: Société, contact: Contact] – Gregg

+0

@Gregg Yep, moi aussi. –

+0

merci pour cela.J'avais un problème avec l'association illégale de backRef lorsque j'ai essayé de cette façon, mais la recherche de ce problème indique un autre problème que je dois résoudre et cela devrait fonctionner. ta ' –

1

Dans notre application, nous avons plusieurs entités qui ont besoin d'adresses. Mais nous avons choisi de les modéliser dans une relation plusieurs-à-plusieurs.

Adresse ressemble à ceci

class Address { 

    // typical address properties 

    Set<Company> getCompanies() { 
    CompanyAddress.findAllByAddress(this).collect { it.company } as Set 
    } 

    static constraints = { 
    // typical constraints 
    } 
} 

Et pour chaque "parent", nous fournissons un getter. Vous pouvez voir getCompanies() dans le code ci-dessus. Si vous ne disposez que de 1 entreprise par adresse, il suffit que getter renvoie la 1 société au lieu d'un Set. L'inverse est vrai dans Company, nous avons un getAddresses().

Adresse de l'entreprise, par exemple, ressemble à ceci ...

class CompanyAddress implements Serializable{ 

    Address address 
    Company company 

    boolean equals(other) { 

    if (this.is(other)){ 
     return true 
    } 

    if (!(other instanceof CompanyAddress)) { 
     return false 
    } 

    other.address?.id == address?.id && 
     other.company?.id == company?.id 
    } 

    int hashCode() { 
    def builder = new HashCodeBuilder() 
    if (address) builder.append(address.id) 
    if (company) builder.append(company.id) 
    builder.toHashCode() 
    } 

    static CompanyAddress get(long companyId, long addressId) { 
    find 'from CompanyAddress where address.id=:addressId and company.id=:companyId', 
     [addressId: addressId, companyId: companyId] 
    } 

    static CompanyAddress create(Company company, Address address, boolean flush = false) { 
    new CompanyAddress(address: address, company: company).save(flush: flush, insert: true) 
    } 

    static boolean remove(Company company, Address address, boolean flush = false) { 
    CompanyAddress instance = CompanyAddress.findByAddressAndCompany(address, company) 
    instance ? instance.delete(flush: flush) : false 
    } 

    static void removeAll(Address address) { 
    executeUpdate 'DELETE FROM CompanyAddress WHERE address=:address', [address: address] 
    } 

    static void removeAll(Company company) { 
    executeUpdate 'DELETE FROM CompanyAddress WHERE company=:company', [company: company] 
    } 

    static mapping = { 
    id composite: ['address', 'company'] 
    version false 
    } 
} 
+0

merci Gregg, j'aime la solution et peut l'utiliser dans le futur. Je suppose que la modélisation de cette façon perd la possibilité d'utiliser des requêtes de critères à travers la relation? d'autres inconvénients que vous avez rencontrés? –

+0

Non, je ne le fais pas. Et cela résout beaucoup de problèmes de performances (au moins jusqu'à la mise en place des sacs Grails 2.0). http://www.infoq.com/presentations/GORM-Performance – Gregg

Questions connexes