首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Cayenne,Postgres:主键生成

Cayenne,Postgres:主键生成
EN

Stack Overflow用户
提问于 2013-11-20 10:54:14
回答 2查看 924关注 0票数 0

我使用Cayenne 3.2M1和Postgres 9.0.1来创建数据库。现在,我遇到了Cayenne的主键生成问题,因为我有多个主键的表,就我所知,Cayenne不能为每个表生成多个主键。所以我希望Postgres来做这项工作。我有一张桌子:

代码语言:javascript
运行
复制
 CREATE TABLE telefonocliente
(
cod_cliente integer NOT NULL DEFAULT currval('cliente_serial'::regclass),
cod_telefono integer NOT NULL DEFAULT nextval('telefonocliente_serial'::regclass),
fijo integer,
CONSTRAINT telefonocliente_pkey PRIMARY KEY (cod_cliente, cod_telefono)
)
WITH (
OIDS=FALSE
);



TelefonoCliente telefono = context.newObject(TelefonoCliente.class);
    telefono.setFijo(4999000);
 context.commitChanges();

下面是我得到的错误:

代码语言:javascript
运行
复制
INFO: --- transaction started.
19/11/2013 22:46:17 org.apache.cayenne.access.dbsync.CreateIfNoSchemaStrategy     processSchemaUpdate
INFO: Full or partial schema detected, skipping tables creation
19/11/2013 22:46:17 org.apache.cayenne.log.CommonsJdbcEventLogger logQuery
INFO: SELECT nextval('pk_telefonocliente')
Exception in thread "main" org.apache.cayenne.CayenneRuntimeException: [v.3.2M1 Jul 07     2013 16:23:58] Commit Exception
at org.apache.cayenne.access.DataContext.flushToParent(DataContext.java:759)
at org.apache.cayenne.access.DataContext.commitChanges(DataContext.java:676)
at org.example.cayenne.Main.main(Main.java:45)
Caused by: org.postgresql.util.PSQLException: ERROR: no existe la relaci?n     ≪pk_telefonocliente≫
  Position: 16
at     org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2102)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1835)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257)
at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:500)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:374)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:254)
at org.apache.cayenne.dba.postgres.PostgresPkGenerator.longPkFromDatabase(PostgresPkGenerator.java:79)
at org.apache.cayenne.dba.JdbcPkGenerator.generatePk(JdbcPkGenerator.java:272)
at org.apache.cayenne.access.DataDomainInsertBucket.createPermIds(DataDomainInsertBucket.java:171)
at org.apache.cayenne.access.DataDomainInsertBucket.appendQueriesInternal(DataDomainInsertBucket.java:76)
at org.apache.cayenne.access.DataDomainSyncBucket.appendQueries(DataDomainSyncBucket.java:78)
at org.apache.cayenne.access.DataDomainFlushAction.preprocess(DataDomainFlushAction.java:188)
at org.apache.cayenne.access.DataDomainFlushAction.flush(DataDomainFlushAction.java:144)
at org.apache.cayenne.access.DataDomain.onSyncFlush(DataDomain.java:685)
at org.apache.cayenne.access.DataDomain$2.transform(DataDomain.java:651)
at org.apache.cayenne.access.DataDomain.runInTransaction(DataDomain.java:712)
at org.apache.cayenne.access.DataDomain.onSyncNoFilters(DataDomain.java:648)
at org.apache.cayenne.access.DataDomain$DataDomainSyncFilterChain.onSync(DataDomain.java:852)
at org.apache.cayenne.access.DataDomain.onSync(DataDomain.java:629)
at org.apache.cayenne.access.DataContext.flushToParent(DataContext.java:727)
... 2 more

我已经尝试了关于Cayenne教程“生成的列”,“主键支持”的建议,但似乎总是得到一些错误。

代码语言:javascript
运行
复制
INFO: SELECT nextval('pk_telefonocliente')
Exception in thread "main" org.apache.cayenne.CayenneRuntimeException: [v.3.2M1 Jul 07 2013 16:23:58] Primary Key autogeneration only works for a single attribute.

我想知道如何解决这个问题。提前感谢

EN

回答 2

Stack Overflow用户

发布于 2013-11-21 15:06:06

从你在评论中的描述来看,在组成'telefonocliente‘主键的2列中,只有一列是真正独立的-- 'cod_telefono’。这将是Cayenne将产生的。在PosgreSQL的情况下,您需要在DB中执行以下序列才能实现此操作:

代码语言:javascript
运行
复制
CREATE SEQUENCE pk_telefonocliente INCREMENT 20 START 200;

现在,第二个PK 'cod_cliente‘是从哪里来的?因为它也是另一个表的FK,这意味着它是一个“依赖”主键,并且必须来自一个关系。所以首先你需要在“telefonocliente”和“cliente”之间映射一个多对一的关系。选中'telefonocliente‘侧的"To Dep Pk“复选框。为您的Java对象生成匹配的ObjRelationship。现在你可以在你的代码中使用它:

代码语言:javascript
运行
复制
Cliente c = .. // get a hold of this object somehow   
TelefonoCliente telefono = context.newObject(TelefonoCliente.class);
telefono.setFijo(4999000);
telefono.setCliente(c); // this line is what will populate 'cod_cliente' PK/FK

应该就是这样了。

票数 3
EN

Stack Overflow用户

发布于 2013-11-20 11:23:26

每个表只能有一个主键!在您的示例中,您在两列上创建了一个主键,也就是说,它是在SQL标准中定义的,并且Postgres很好地支持它。

然而,在Cayenne文档中有一个not:

Cayenne仅支持每个表的单列自动生成主键。

请参阅页面底部的http://cayenne.apache.org/docs/3.0/primary-key-generation.html

也许他们可以在更新的版本中修复它,或者你可以向Cayenne社区提出请求。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20086442

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档