After some experiments, i've found one solution using an anonymous PL/PgSQL code block:
DO $$DECLARE
parentid bigint;
BEGIN
INSERT INTO parenttest (mydata) VALUES ('rootnode');
parentid:=currval('parenttest_id_seq');
INSERT INTO parenttest (mydata,parent) VALUES ('child 1',parentid);
INSERT INTO parenttest (mydata,parent) VALUES ('child 2',parentid);
parentid:=currval('parenttest_id_seq');
INSERT INTO parenttest (mydata,parent) VALUES ('child 2.1',parentid),('child 2.2',parentid);
END$$;
It's possible to use it within a single request from the client and i don't have to generate anything at the client-side, so this may be one possible solution for my problem.
Edit:
It can be expressed shorter like this:
DO $$DECLARE
parentid bigint;
BEGIN
INSERT INTO parenttest (mydata) VALUES ('Flat') RETURNING id INTO parentid;
INSERT INTO parenttest (mydata, parent) VALUES ('Subflat 1', parentid);
INSERT INTO parenttest (mydata, parent) VALUES ('Subflat 2', parentid)RETURNING id INTO parentid;
INSERT INTO parenttest (mydata, parent) VALUES ('Subflat 2.1', parentid), ('Subflat 2.2', parentid);
END$$;