vector
vector

Reputation: 7576

MappingException trying to use POJO for domain object in Grails

I have couple of POJOs:

public class FlightBase {

    public AirportBase getDeparture() {
        return departure;
    }

    public void setDeparture(AirportBase departure) {
        this.departure = departure;
    }

    public AirportBase getDestination() {
        return destination;
    }

    public void setDestination(AirportBase destination) {
        this.destination = destination;
    }

    public String getDetails() {
        return details;
    }

    public void setDetails(String details) {
        this.details = details;
    }
    String details = "";
    AirportBase departure;
    AirportBase destination;
}

public class AirportBase {
    String icaoIdentifier = "KSPG";

    public String getIcaoIdentifier() {
        return icaoIdentifier;
    }

    public void setIcaoIdentifier(String icaoIdentifier) {
        this.icaoIdentifier = icaoIdentifier;
    }

}

... I'm trying to use these as domain classes in a grails app by extending them:

package flightloggrails

    import com.flightloglib.domain.AirportBase
    import com.flightloglib.domain.FlightBase

    class Flight extends FlightBase  {

        static hasOne = [departure:AirportBase, destination:AirportBase ]

        static mapping = {

            departure type: Airport
            destination type: Airport
        }


        static constraints = {
            details( blank:false,null:false, widget:'textarea')
        }
    }

and this domain class :

package flightloggrails

import com.flightloglib.domain.AirportBase

class Airport extends AirportBase {

    static constraints = {
    }
}

... keep getting this trying to execute 'run-app' (preceded by 'clean') :

 Error 2012-04-24 06:50:18,892 [pool-5-thread-1] ERROR context.GrailsContextLoader  - Error executing bootstraps: Error creating bean with name 'transactionManagerPostProcessor': Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManager': Cannot resolve reference to bean 'sessionFactory' while setting bean property 'sessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory': Invocation of init method failed; nested exception is org.hibernate.MappingException: Could not determine type for: flightloggrails.Airport, at table: flight, for columns: [org.hibernate.mapping.Column(departure)]
Message: Error creating bean with name 'transactionManagerPostProcessor': Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManager': Cannot resolve reference to bean 'sessionFactory' while setting bean property 'sessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory': Invocation of init method failed; nested exception is org.hibernate.MappingException: Could not determine type for: flightloggrails.Airport, at table: flight, for columns: [org.hibernate.mapping.Column(departure)]
   Line | Method
->> 303 | innerRun in java.util.concurrent.FutureTask$Sync
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|   138 | run      in java.util.concurrent.FutureTask
|   886 | runTask  in java.util.concurrent.ThreadPoolExecutor$Worker
|   908 | run      in     ''
^   662 | run . .  in java.lang.Thread

Caused by BeanCreationException: Error creating bean with name 'transactionManager': Cannot resolve reference to bean 'sessionFactory' while setting bean property 'sessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory': Invocation of init method failed; nested exception is org.hibernate.MappingException: Could not determine type for: flightloggrails.Airport, at table: flight, for columns: [org.hibernate.mapping.Column(departure)]
->> 303 | innerRun in java.util.concurrent.FutureTask$Sync
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|   138 | run      in java.util.concurrent.FutureTask
|   886 | runTask  in java.util.concurrent.ThreadPoolExecutor$Worker
|   908 | run      in     ''
^   662 | run . .  in java.lang.Thread

Caused by BeanCreationException: Error creating bean with name 'sessionFactory': Invocation of init method failed; nested exception is org.hibernate.MappingException: Could not determine type for: flightloggrails.Airport, at table: flight, for columns: [org.hibernate.mapping.Column(departure)]
->> 303 | innerRun in java.util.concurrent.FutureTask$Sync
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|   138 | run      in java.util.concurrent.FutureTask
|   886 | runTask  in java.util.concurrent.ThreadPoolExecutor$Worker
|   908 | run      in     ''
^   662 | run . .  in java.lang.Thread

Caused by MappingException: Could not determine type for: flightloggrails.Airport, at table: flight, for columns: [org.hibernate.mapping.Column(departure)]
->> 303 | innerRun in java.util.concurrent.FutureTask$Sync
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|   138 | run      in java.util.concurrent.FutureTask
|   886 | runTask  in java.util.concurrent.ThreadPoolExecutor$Worker
|   908 | run      in     ''
^   662 | run . .  in java.lang.Thread

Upvotes: 4

Views: 2371

Answers (2)

Daniil Shevelev
Daniil Shevelev

Reputation: 12027

It seems like there is a better way to do this:

A good question & answer on the stackoverflow

The Grails documentation

Upvotes: 2

Fabiano Taioli
Fabiano Taioli

Reputation: 5540

You are mapping a many-to-one relation with a class that is not a domain.

class Flight extends FlightBase  {
    static hasOne = [departure:AirportBase, destination:AirportBase ]
...
}

AirportBase must be a domain. Or you can map with class Airport

class Flight extends FlightBase  {
    static hasOne = [departure:Airport, destination:Airport ]
...
}

Upvotes: 3

Related Questions