gpt4 book ai didi

dropwizard - jdbi 返回插入时自动生成的值

转载 作者:行者123 更新时间:2023-12-02 23:14:54 24 4
gpt4 key购买 nike

我正在使用 dropwizard,我想构建一个在实体中具有各种外键关系的 REST 应用程序。

例如,给出以下 3 个表:

-- table persons
CREATE TABLE PUBLIC.PERSONS(
ID BIGINT DEFAULT NOT NULL AUTOINCREMENT,
FIRST_NAME VARCHAR(255),
LAST_NAME VARCHAR(255),
BIRTHDAY DATE,
ADDRESS_ID BIGINT NOT NULL,
CREATED TIMESTAMP DEFAULT 'current_timestamp',
MODIFIED TIMESTAMP
);
ALTER TABLE PUBLIC.PERSONS ADD CONSTRAINT PUBLIC.PK_PERSONS PRIMARY KEY(ID);

-- table customers
CREATE TABLE PUBLIC.CUSTOMERS(
ID BIGINT DEFAULT NOT NULL AUTOINCREMENT,
PERSON_ID BIGINT NOT NULL,
STATUS_CODE VARCHAR(100) DEFAULT 'ACQUISITION' NOT NULL,
CREATED TIMESTAMP DEFAULT 'current_timestamp',
MODIFIED TIMESTAMP
);
ALTER TABLE PUBLIC.CUSTOMERS ADD CONSTRAINT PUBLIC.PK_CUSTOMERS PRIMARY KEY(ID);

-- table addresses
CREATE TABLE PUBLIC.ADDRESSES(
ID BIGINT DEFAULT NOT NULL AUTOINCREMENT,
LINE_1 VARCHAR(255),
LINE_2 VARCHAR(255),
ZIP VARCHAR(255),
CITY VARCHAR(255),
COUNTRY_CODE VARCHAR(3),
PHONE VARCHAR(255),
FAX VARCHAR(255),
CREATED TIMESTAMP DEFAULT 'current_timestamp',
MODIFIED TIMESTAMP
);
ALTER TABLE PUBLIC.ADDRESSES ADD CONSTRAINT PUBLIC.PK_ADDRESSES PRIMARY KEY(ID);

-- and following forign key constraints:
ALTER TABLE PUBLIC.PERSONS ADD CONSTRAINT
PUBLIC.FK_PERSON_ADDRESS FOREIGN KEY(ADDRESS_ID)
REFERENCES PUBLIC.ADDRESSES(ID) ON DELETE SET NULL NOCHECK;

ALTER TABLE PUBLIC.CUSTOMERS ADD CONSTRAINT
PUBLIC.FK_CUSTOMER_PERSON FOREIGN KEY(PERSON_ID)
REFERENCES PUBLIC.PERSONS(ID) ON DELETE SET NULL NOCHECK;

我已经开始实现一个 customerDAO,它使用一个 SQL 查询读取客户表和引用表的数据,这并不是很复杂:

@RegisterMapper(CustomerResultMapper.class)
public interface CustomerDAO {

@SqlQuery("select p.id as person_id, "
+ "p.first_name, p.last_name, p.birthday, "
+ "c.id as customer_id, c.status_code, "
+ "a.id as address_id, a.line_1, a.line_2, a.zip, "
+ "a.city, a.country_code, a.phone, a.fax "
+ "from customers c, persons p, addresses a "
+ "where c.id = :id "
+ "and c.person_id = p.id "
+ "and p.address_id = a.id")
public Customer findCustomerById(@Bind("id") long id);
}

(为了简洁起见,我跳过了映射器,因为这不是我的实际问题)

现在我想插入一个新客户,我拥有所有必需的数据,包括属于引用表中的数据。

我找不到一种方法如何使用 jdbi 注释执行多个查询,所以我想,我必须为每个表创建一个 DAO 方法,并从 java 中插入数据,手动更新外键引用。

但这也不起作用,因为我找不到在插入后读取自动生成的 ID 值的方法。

知道如何解决这个问题以便保持引用正确吗?

最佳答案

没关系,我同时找到了解决方案,至少如何获取自动生成的 key :

在您的 DAO 中,添加 @GetGenerateKeys 注释,确保该方法的返回值与生成的 key 的值匹配:

@SqlUpdate("insert into addresses (line_1) values ('address line 1')")
@GetGeneratedKeys
public long insertAddress();

然后在您的资源中,您可以简单地使用返回值:

long id = customerDAO.insertAddress();
System.out.println("Found id " + id);

这可以获取一个语句的生成 key ,但就我而言,我仍然需要进行多个查询并手动填写正确的引用。

如果有人知道我如何简化此过程并自动填写引用文献,我仍然有兴趣了解。

谢谢。

关于dropwizard - jdbi 返回插入时自动生成的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26133752/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com