Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Adding business logic to a domain class using a getter style method name

Tags:

grails

groovy

I'm attempting to add a method to a grails domain class, e.g.

class Item {

  String name

  String getReversedName() {
    name.reverse()
  }

}

When I attempt to load the application using grails console I get the following error:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory':Invocation of init method failed; nested exception is org.hibernate.PropertyNotFoundException: Could not find a setter for property reversedName in class Item ... 18 more

It looks like Hibernate is interpreting getReversedName() as a getter for a property, however in this case it is a derived field and hence should not be persisted. Obviously in my actual code the business logic I'm exposing is more complex but it isn't relevant to this question. I want to be able to call item.reversedName in my code/gsps.

How can I provide property (getter) access to a method in a Grails domain class without Grails attempting to map it with Hibernate?

like image 996
Richard Paul Avatar asked Dec 22 '22 02:12

Richard Paul


1 Answers

I believe you have two choices:

1) Use def

def getReversedName() {
  name.reverse()
}

2) Add a transients declaration to the top of your domain object:

 static transients = [ 'reversedName' ] 

[edit] (I'd go with #1) (I'd go with #2) ;-)

like image 153
tim_yates Avatar answered May 18 '23 17:05

tim_yates