4

我有几个 POJO:

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;
    }

}

...我试图通过扩展它们将它们用作 grails 应用程序中的域类:

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')
        }
    }

和这个域类:

package flightloggrails

import com.flightloglib.domain.AirportBase

class Airport extends AirportBase {

    static constraints = {
    }
}

...继续尝试执行'run-app'(前面是'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
4

2 回答 2

3

您正在将多对一关系映射到一个非域的类。

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

AirportBase 必须是一个域。或者您可以使用类 Airport 进行映射

class Flight extends FlightBase  {
    static hasOne = [departure:Airport, destination:Airport ]
...
}
于 2012-05-03T17:02:09.147 回答
2

似乎有更好的方法来做到这一点:

关于stackoverflow的一个很好的问题和答案

Grails 文档

于 2013-06-19T22:17:53.733 回答