我试图想象如何将jOOQ与桥牌表一起使用。假设你有
CREATE TABLE TableA (
id BIGSERIAL PRIMARY KEY
)
CREATE TABLE TableB (
id BIGSERIAL PRIMARY KEY
)
CREATE TABLE TableBridge (
id BIGSERIAL,
table_a_id INTEGER NOT NULL,
table_b_id INTEGER NOT NULL,
CONSTRAINT tablea_pk_id PRIMARY KEY (table_a_id)
REFERENCES TableA (id) MATCH SIMPLE,
CONSTRAINT tableb_pk_id PRIMARY KEY (table_b_id)
REFERENCES TableB (id) MATCH SIMPLE
)
使用jOOQ映射此模式时,将有三个记录类,TableARecord
、TableBRecord
和TableBridgeRecord
。
如果我想通过为TableA插入a记录来持久化,我应该首先创建并持久化TableB记录,然后为TableB分配行,然后手动添加TableBridge行吗?难道没有任何方法可以自动保存桥接表中的行吗?
有几种方法可以解决这种问题:
使用标准jOOQ解决此类问题的最惯用方法是编写一条SQL语句,一次性处理所有三个插入:
ctx.insertInto(TABLE_BRIDGE)
.columns(TABLE_BRIDGE.TABLE_A_ID, TABLE_BRIDGE.TABLE_B_ID)
.values(
ctx.insertInto(TABLE_A)
.columns(TABLE_A.VAL)
.values(aVal)
.returning(TABLE_A.ID)
.fetchOne()
.get(TABLE_A.ID),
ctx.insertInto(TABLE_B)
.columns(TABLE_B.VAL)
.values(bVal)
.returning(TABLE_B.ID)
.fetchOne()
.get(TABLE_B.ID)
)
.execute();
以上内容适用于jOOQ 3.8。很可能,未来的版本将删除一些关于返回()…获取()…获取()的冗长内容。
我假设您使用的是PostgreSQL,它来自于您的数据类型用法,因此下面的SQL语句也可能是您的一个选项:
WITH
new_a(id) AS (INSERT INTO table_a (val) VALUES (:aVal) RETURNING id),
new_b(id) AS (INSERT INTO table_b (val) VALUES (:bVal) RETURNING id)
INSERT INTO table_bridge (table_a_id, table_b_id)
SELECT new_a.id, new_b.id
FROM new_a, new_b
目前,jOOQ 3.8 API不完全支持上述查询,但您可以通过使用一些普通SQL绕过jOOQ API的限制:
ctx.execute(
"WITH "
+ " new_a(id) AS ({0}), "
+ " new_b(id) AS ({1}) "
+ "{2}",
// {0}
insertInto(TABLE_A)
.columns(TABLE_A.VAL)
.values(aVal)
.returning(TABLE_A.ID),
// {1}
insertInto(TABLE_B)
.columns(TABLE_B.VAL)
.values(bVal)
.returning(TABLE_B.ID),
// {2}
insertInto(TABLE_BRIDGE)
.columns(TABLE_BRIDGE.TABLE_A_ID, TABLE_BRIDGE.TABLE_B_ID)
.select(
select(field("new_a.id", Long.class), field("new_b.id", Long.class))
.from("new_a, new_b")
)
);
显然,在这里,未来的jOOQ API会有改进。
在这种特殊的简单情况下,您只需拨打电话:
TableARecord a = ctx.newRecord(TABLE_A);
a.setVal(aVal);
a.store();
TableBRecord b = ctx.newRecord(TABLE_B);
b.setVal(bVal);
b.store();
TableBridgeRecord bridge = ctx.newRecord(TABLE_BRIDGE);
bridge.setTableAId(a.getId());
bridge.setTableBId(b.getId());
bridge.store();
问题内容: 是否有人尝试过将JOOQ与Spring框架一起使用,还是我有新的突破? http://www.jooq.org 问题答案: 是的,有很多人(到目前为止)。jOOQ手册包括一个有关如何开始使用jOOQ,Spring,Spring- TX和BoneCP的教程: http://www.jooq.org/doc/latest/manual/getting-started/tutorials/j
软件网桥 网桥是一个链路层设备,可基于 MAC 地址在网络之间转发流量。网桥识别哪些主机连接到每个网络,构建 MAC 地址表,然后根据该表做出包转发决策。可以在 Linux 环境中使用软件网桥以仿真硬件网桥。软件网桥的最常见应用是在虚拟化应用程序中,用于在一个或多个虚拟 NIC 中共享一个硬件 NIC。 Bridge 配置1. 创建一个 Bridge 并分配 IP 地址 # nmcli conne
bridge. Download the latest version About bridge. bridge. is a powerful add-on editor designed to speed up your development process. It provides a rich editing experience for all files inside behavior
Bridge.NET is an open source C#-to-JavaScript Compiler. Write your application in C# and run on billions of devices. Write in C#. Run in a Web Browser. C# JavaScript public class Program{ public st
问题内容: 假设我为JOOQ提供了一个自定义,它恰好使用自动提交设置为false的连接池。 实现大致是: 如何将两个jooq查询包装到一个事务中? 使用DefaultConnectionProvider很容易,因为只有一个连接-但是对于池,我不确定该怎么做。 问题答案: jOOQ 3.4交易API 使用jOOQ 3.4,已添加事务API以通过JDBC,Spring或JTA事务管理器进行抽象。该AP
HomeKit Bridge This plugin for the Indigo Domotics home automation platform that publishes Indigo devices and action groups to Homebridge so that you can use your Indigo devices and actions in HomeKit