【发布时间】:2011-03-30 21:48:10
【问题描述】:
所以我有两张桌子:
table A
-id
-other stuff
table B
-id
-stuff
-a_id, a fk column to id in A
在休眠中,我将 B.a_id 映射为一个简单的属性(我不想要多对一并获取整个 A 实例,我只想要 Id)。所以假设我在 A 中有一行 id=100。
如果我尝试使用 a_id=100 在 B 中插入新行,我会收到 postgres 外键约束违规,说不存在 id=100 的 A!
我不明白这一点。 我在hibernate中打开了show_sql,它为B插入生成了这个:
insert into B (stuff, a_id) values (?, ?)
这样看起来是合法的。
我对 B.a_id 的休眠映射如下所示:
<property name="aId" type="java.lang.Long" unique="true" not-null="true">
<column name="a_id" />
</property>
在 postgres 中添加的约束看起来像:
alter table B
add constraint myfk
foreign key (a_id)
references A;
有什么想法吗?
谢谢
edit:我认为hibernate与此无关。如果我尝试使用 sql 手动插入,我会得到同样的错误。
edit2:有一个微妙的变化 - id 字段是 int8 的,并且上面有序列:
create table A (
id int8 not null unique,
stuff varchar(10),
primary key(id)
);
create table B (
id int8 not null unique,
a_id int8 not null references A,
primary key(id)
);
create sequence a_seq;
ALTER SEQUENCE a_seq OWNED BY a.id;
ALTER TABLE a ALTER COLUMN id SET DEFAULT nextval('a_seq');
create sequence b_seq;
ALTER SEQUENCE b_seq OWNED BY b.id;
ALTER TABLE b ALTER COLUMN id SET DEFAULT nextval('b_seq');
【问题讨论】:
-
SELECT * FROM a WHERE id = 100返回什么?id是PRIMARY KEY在A中吗?
标签: hibernate postgresql