Multiple Many-to-Many in Grails

Creating many-to-many relationships in Grails is quite simple. It is
also possible to have multiple many-to-many relationships in a single
class, but for some reason I found little documentation on how to do
this. It is actually quite simple once you know how to and pretty much
comes down to syntactic sugar, so to speak. Read more after the break.

Let’s assume you wanted to model two distinct domain classes which both
can have Tags.

Many-to-Many UML Diagram

Now, the owning side of the relationship should be the DomainClass1
and DomainClass2 respectively.

Your domain class code would look something like this:

class DomainClass1 {
  ...
  static hasMany = [
    tags: Tag
  ]
  static mappedBy = [
    tags: "domainClass1s"
  ]
}
class DomainClass2 {
  ...
  static hasMany = [
    tags: Tag
  ]
  static mappedBy = [
    tags: "domainClass2s"
  ]
}

Next, you need to define the Tag class:

class Tag {

  String value

  static hasMany = [
    domainClass1s: DomainClass1,
    domainClass2s: DomainClass2
  ]

  static mappedBy = [
    domainClass1s: "tags",
    domainClass2s: "tags"
  ]

  static belongsTo = [
    DomainClass1, DomainClass1
  ]

  static constraints = {
    value(unique:true)
  }

  @Override public String toString() {
    return value
  }
}

The part that is rarely documented online is the belongsTo
statement.

static belongsTo = [
  DomainClass1, DomainClass1
]

This tells groovy the owners are DomainClass1 and DomainClass2. You’re
done. Pretty simple, isn’t it? Hope this helps someone.

References

http://www.grails.org/doc/latest/guide/single.html#5.5.2%20Custom%20ORM%20Mapping

http://osdir.com/ml/lang.groovy.grails.user/2008-05/msg02094.html

Connecting Apache2 and Tomcat6

If you ever need to serve Tomcat applications through Apache2, here is a
quick guide on how to do this on Ubuntu.

First, install mod-jk:

sudo apt-get install libapache2-mod-jk
sudo a2enmod jk

Then, edit workerss.properties

sudo vi /etc/libapache2-mod-jk/workers.properties

and adapt the following values (assuming you have installed the
openjdk):

workers.tomcat_home=/usr/share/tomcat6
workers.java_home = /usr/lib/jvm/java-6-openjdk

Then, mount the site using JkMount. Do

sudo vi /etc/apache2/sites-enabled/000-default

and then add the following line

JkMount /path/to/app/* ajp13_worker

And update the mod-jk settings in jk.load. do

sudo vi /etc/apache2/mods-available/jk.load

and update to file to read like this

LoadModule jk_module /usr/lib/apache2/modules/mod_jk.so
JkWorkersFile /etc/libapache2-mod-jk/workers.properties
JkLogFile /var/log/apache2/mod_jk.log
JkLogLevel error

Update the server.xml with

sudo vi /etc/tomcat6/server.xml

and then uncommenting the line

<connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

Finally, restart the services

sudo /etc/init.d/apache2 restart
sudo /etc/init.d/tomcat6 restart

References

http://www.docshare.com/doc/197611/Installing-Tomcat6-on-Ubuntu-with-Jk-Connecto

http://ubuntuforums.org/showthread.php?t=422472

http://rcpeters.blogspot.com/2009/05/installing-apache2-and-tomcat6-on.html