使用Cayenne从Postgress数据库生成具有多个模式的类

时间:2018-05-28 11:29:26

标签: java postgresql apache-cayenne

我有多个模式的PostgreSQL数据库,我使用Apache Cayenne生成Java类。问题是cayenne在不同模式的表上跳过外键。例如:

引用schema_b.booking的表schema_a.my_user

create table schema_b.booking
(
    id bigserial not null constraint booking_pkey primary key,
    address_id integer not null constraint cde_fk references schema_b.address
    ...,
    created_by integer not null constraint abc_fk references schema_a.my_user
);

生成的Java类如下所示:

class Booking {
     private Long id; 
     private Address addressId; //this is OK
     private Integer createdBy; //NOT OK (Integer instead of MyUser)
}

控制台日志显示了不同架构中每个FK的此条目:

[INFO] Skip relation: 'null.schema_a.my_user.id <- null.schema_b.booking.created_by # 1' because it related to objects from other catalog/schema
[INFO]      relation primary key: 'null.schema_a'
[INFO]        primary key entity: 'null.schema_a'
[INFO]      relation foreign key: 'null.schema_b'
[INFO]        foreign key entity: 'null.schema_b'

问题在于Booking#createdBy不是MyUser

我搜索了SO和官方文档,但没有成功。有没有办法实现这个目标?我知道另一个选择是将所有表移动到单个模式中,但这对我们的项目来说几乎是不可行的。

1 个答案:

答案 0 :(得分:2)

你是对的,Cayenne只是跳过了跨架构的关系。 这看起来像是一个应该删除的过时限制。

如果您只这样做一次,您可以在Cayenne Modeler中添加这些缺失的关系。如果您需要定期将Cayenne型号与您的DB同步,那么可能更难以克服。 一种选择是完全跳过关系加载(see docs),并手动创建它们(或使用Modeler中的“推断关系”工具)。在这种情况下,所有其他内容(表和列)应该同步正常。另一种选择是等待 4.1.M2 版本的Cayenne我相信很快就会准备好(虽然没有确切的日期)