我的树结构实体名为Category with children field。
@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinColumn(name = "parent_id")
@OrderColumn
@JsonProperty("children")
private List<Category> children = new LinkedList<Category>();
我的谱系字段也有助于列表树。 (看这里:https://stackoverflow.com/a/6277217)。
@JsonIgnore
@Column(name = "LINEAGE")
private String lineAge = new String("/");
创建类别后,我想附加到插入类别的lineage parentId。我在插入触发器之后创建,但插入行的外键(PARENT_ID)在触发器的上下文中始终为null。
create trigger add_category_lineage
after insert on CATEGORY
referencing new as insertedrow
for each row
update CATEGORY set LINEAGE = LINEAGE || TRIM(CAST((insertedrow.PARENT_ID AS CHAR(10)))) || '/' where ID = insertedrow.ID and insertedrow.PARENT_ID is not null
我正在使用10.11.1.1德比。为什么插入行中的外键(仅在触发器上下文中)始终为null,它适用于任何其他字段,例如name。也许代替使用插入触发器将父id附加到lineage字段后我可以从hibernate级别执行此操作吗?
编辑1。
我用postgreSQL 9.4测试了这个例子,结果是一样的。
CREATE OR REPLACE FUNCTION after_insert_category_trigger_function()
RETURNS trigger AS '
BEGIN
UPDATE category set lineage = lineage || new.parent_id::text || ''/'' where id = new.id;
RETURN NEW;
END' LANGUAGE 'plpgsql';
CREATE TRIGGER after_insert_category_trigger
AFTER INSERT ON category
FOR EACH ROW
EXECUTE PROCEDURE after_insert_category_trigger_function();
创建实体后的结果(id = 25)。就像你可以看到它适用于名称字段(id = 23):
在插入触发器之前它也不起作用:
CREATE OR REPLACE FUNCTION after_insert_category_trigger_function()
RETURNS trigger AS '
BEGIN
NEW.LINEAGE := NEW.LINEAGE || new.parent_id::text || ''/'';
RETURN NEW;
END' LANGUAGE 'plpgsql';
CREATE TRIGGER after_insert_category_trigger
BEFORE INSERT ON category
FOR EACH ROW
EXECUTE PROCEDURE after_insert_category_trigger_function();