- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
考虑以下在实体 A 和 B 中使用循环引用的 Hibernate 3.6 实体映射:
@MappedSuperclass
abstract class Entity {
@Id
protected UUID id = UUID.randomUUID();
@Version
protected Integer revision;
}
@Entity
class A extends Entity {
// not null in the database
@OneToOne(optional = false)
B b;
}
@Entity
class B extends Entity {
// not null in the database
@ManyToOne(optional = false)
A a;
}
实体的 id 是在创建新实例时生成的,因此它在任何 SQL INSERT 之前设置。要确定一个实例是否是 transient 的,可以使用 Interceptor
:
class EntityInterceptor extends EmptyInterceptor {
@Override
public boolean isTransient(Object entity) {
return ((Entity)entity).getRevision == null;
}
}
当我尝试保存(在单个事务中)A 和 B 的实例(将引用设置为彼此)时,Hibernate 失败并出现 TransientObjectException
(对象引用未保存的 transient 实例 - 保存刷新前的 transient 实例)。
A a = new A();
B b = new B();
a.setB(b);
b.setA(a);
// start transaction
sessionFactory.getCurrentSession().saveOrUpdate(a); // a before b or vice versa doesn't matter
sessionFactory.getCurrentSession().saveOrUpdate(b);
sessionFactory.getCurrentSession().flush();
// commit
当我将映射更改为 A.b 和 B.a 的级联保存时,Hibernate 会为 A 生成以下 SQL INSERT 语句:
INSERT INTO A (id, revision, b) VALUES ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa', 0, NULL);
这违反了 A.b 上的 NOT NULL
约束并导致 ConstraintViolationException
。即使 B 的 id 在插入时已知,它也没有在 SQL INSERT 中设置。在数据库 (PostgreSQL 9.1) 中,A.b 上的 FK 约束被定义为 DEFERRABLE INITIALLY DEFERRED
,因此如果设置了 A.b,则以下 INSERT 语句将运行而不会出现任何错误:
START TRANSACTION;
INSERT INTO A (id, revision, b) VALUES ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa', 0, 'bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb');
INSERT INTO B (id, revision, a) VALUES ('bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb', 0, 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa');
COMMIT;
当我在数据库中删除 A.b 上的 NOT NULL 约束并保持 级联保存 映射上述代码以保存 A 和 B 时工作正常。编辑NOT NULL
约束在 PostgreSQL 中不能延迟,只有 FK 约束可以延迟。结束编辑老实说,我没有查看在这种情况下生成的 SQL 语句(我现在无法重现),但我想它看起来像这样:
START TRANSACTION;
INSERT INTO A (id, revision, b) VALUES ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa', 0, NULL);
INSERT INTO B (id, revision, a) VALUES ('bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb', 0, 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa');
UPDATE A SET b = 'bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb' WHERE id = 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa';
COMMIT;
我知道对于我在这里尝试做的事情可能有更好的实体设计,但我真的很想知道是否有办法保持 NOT NULL
约束(如果可能的话还有没有级联保存的原始映射)并使我的原始代码工作。有没有办法告诉 Hibernate 只插入 A 且 A.b = B.id,即使 B 在插入 A 时是 transient 的?通常,我找不到任何有关 Hibernate 和延迟 FK 约束的文档,因此感谢任何关于此的指示。
最佳答案
你这里的都是经典bidirectional relationship .双方相互参照。如果你有双向的一侧需要标记为更强的一侧,这是通过使用 mappedBy 完成的。或反面标记灯芯侧。此外,您有 FK 约束,因此需要定义 not-null 为真,以便 hibernate 将使用 FK 插入。
看这个complete .
关于 hibernate 3.6 : how to make use of deferred FK constraints when inserting entities with circular reference?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11267089/
假设我有两张 table ,a和 b : a { pk as int fk as int ... } b { pk as int ... } 我想在查询中加入 a 和 b,如下所示: FRO
我在 MYSQL 数据库的各个表中分配的列数比实际需要的长度要长。所以现在我尝试使它们具有适当的长度。它们是 VARCHAR(64),我想让它们变成 CHAR(36)。这些列涉及外键。这些更改将成为一
这是我的 table : 成员:ID,... 产品:ID,... 我的 Member 表有一些值,如果 Id = 0,则没有,并且我不想添加任何 Id = 0 的成员,所以我尝试运行此脚本: ALTE
这个问题已经有答案了: MySQL Relationships (1 个回答) 已关闭 4 年前。 这个问题可能在其他帖子中得到了回答,但我一直在搜索,但没有找到类似的东西(很有趣): 我使用 Lar
两个表,使用这些脚本创建: create table user_auth ( username varchar(255) NOT NULL, password varchar(255)
如果我添加带有 ON DELETE CASCADE 之类的 FK,我以后会遭受后果吗? 如果不是,我应该为 CakePHP 的 MySQL 中的 FK 使用什么命名约定? 最佳答案 您可以看到布局的命
我有一个类似的问题: How to create foreign key that is also a primary key in MySQL? 但是我的架构似乎与答案匹配,但仍然返回错误“ERRO
我有 2 个实体:PurchaseRequest (PR) 和 PurchasingRequestLineItem (PRLI)。他们遵循典型的关系模式,即 PR 有许多 PRLI。我在 PRLI 上
在尝试通过删除连接(非规范化)来优化物理数据模型时,我选择采用用户可能为 CommEventPurposeType 指定的所有可能值,将它们实现为 中的 BOOLEAN 属性>CommEventPur
我猜这些问题似乎很令人困惑。 库存实体 @Entity @IdClass(InventoryPK.class) public class Inventory { @Id @ManyTo
UNIQUE(col1, col2) 与 FK(col1), FK(col2) 我目前启用了两个索引,并且我不太关心外部关系本身。所以我想知道通过拥有所有这些键,我是否会获得冗余索引以提高读取性能,或
我需要将名为“practice”的列插入到表“cred_insurances”中,该表是一个 FK 引用表“practices” PK “id” 最佳答案 您需要通过在 mysql 提示符下运行以下命
使用 JPA 注释和 hibernate ,我们最近遇到了一个单向单多映射问题,如下所示: @Entity public class FooOrder extends AbstractEntity{
我经常听说在编写测试时不要使用随机数据,这对于大多数数据来说似乎是合理的。 但是,我认为我有可能需要这样做的情况。我正在处理的代码有一些非 AR 模型。例如,用户模型不受数据库表支持,因为我们通过 A
我的情况(简化)如下所示: 表 UNITS 在 UNITS.NAME 上有一个 PK。 (单位名称, varchar(12)) 表 DEPTS 在 DEPTS.NAME 上有一个 PK。 (部门名称,
我已经使用现有数据库的代码优先方法创建了一个 MVC 应用程序。 我注意到我的一个表不需要外键,所以我尝试删除它但我不断收到: The object 'FK_BorrowedProperty_code
为什么我的初始 update-database 失败了,我需要在我的数据库表类中更改什么才能使其正常工作? 当然,我可以将迁移脚本中的onDelete: ReferentialAction.Casca
我的主要目标是获取所有数据的最后更新时间。 详细信息:我有一张 table - 群组 groupId groupName timeUpdated (timestamp - on update) 还有另
作为练习,我正在构建我的第一个 SQL 数据库。我试图为数据库中的所有表创建语句。我想知道是否可以删除任何外键? 我的第二个问题是如何对使用 4 个或更多表的联接的数据库进行查询。 任何答案都将受到赞
我正在尝试在我的 H2 数据库中运行此 mysql 命令。 DB设置为mysql模式。 -- -----------------------------------------------------
我是一名优秀的程序员,十分优秀!