6

我正在尝试在 Grails 2.2.1 中使用具有多对一关系的嵌入式域。这是我正在尝试做的简化版本。

我正在映射到现有的数据库表:

create table incident (id bigint generated by default as identity, state_id bigint not null, primary key (id));
create table state (id bigint generated by default as identity, name varchar(255) not null, primary key (id));
alter table incident add constraint FK52F44D27499E79E foreign key (state_id) references state;

映射到“事件”表的域:

class Incident {
    Vehicle vehicle
    static embedded = ['vehicle']
}

class Vehicle{
    State state
    static mapping = {
        state column: 'state_id'
    }   
}  

映射到“状态”表的域:

class State {
    String name 
}

当我尝试运行我的应用程序时,我收到以下错误:

消息:创建名为“transactionManagerPostProcessor”的 bean 时出错:bean 初始化失败;嵌套异常是 org.springframework.beans.factory.BeanCreationException:创建名为“transactionManager”的 bean 时出错:设置 bean 属性“sessionFactory”时无法解析对 bean“sessionFactory”的引用;嵌套异常是 org.springframework.beans.factory.BeanCreationException:创建名为“sessionFactory”的 bean 时出错:调用 init 方法失败;嵌套异常是org.hibernate.MappingException:无法确定类型:test.State,在表:事件,列:[org.hibernate.mapping.Column(vehicle_state)]

是否可以在嵌入式域中建立多对一关联?

--更新--

我最终使用了一种解决方法来获取状态。

class Vehicle{

    static transients = [ "state" ]

    Long stateId

    static mapping = {
        stateId column: 'state_id'  
    }

    State getState(){
        State.get(this.stateId)
    }
}
4

2 回答 2

4

从 Grails 2.2.1 开始,嵌入式域类存在一些可用性问题,使其难以使用,尤其是在遗留数据库中。

  1. 关系不起作用
  2. 自定义列映射不起作用

您最好直接在所属类中映射列,然后创建一个辅助方法来处理嵌入的实体。

例如:

// grails-app/domain/yourpkg/Incident.groovy
class Incident {
    State state

    public Vehicle getVehicleData() {
        return new Vehicle(state: state)
    }

    public void updateWithVehicle(Vehicle vehicle) {
        state = vehicle.state
    }

    static mapping = {
        state column: 'state_id'
    }
}

// src/groovy/yourpkg/Vehicle.groovy
class Vehicle {
    State state
}
于 2013-04-17T15:01:46.407 回答
0

在这种情况下,域必须是serialized(包括嵌入Vehicle的,如果移动到,则不会成为持久性的一部分src/groovy)并equals() hashCode()为类生成。老派,但效果很好,应用程序运行正常。

Incedent.groovy

import groovy.transform.EqualsAndHashCode

@EqualsAndHashCode
class Incedent implements Serializable{
    Vehicle vehicle
    static embedded = ['vehicle']

    class Vehicle{
        State state
    }
}

状态.groovy

import groovy.transform.EqualsAndHashCode

@EqualsAndHashCode
class State implements Serializable {
    String name
}

按照上述内容,您将获得Incedent一个数据类型为 VARBINARY 的嵌入列(在内存 H2 db 中进行测试时)。我更喜欢将其stateName作为字符串Vehicle

在此处输入图像描述

于 2013-04-16T22:28:32.750 回答