PostgreSQL / Derby / Hibernate插入触发器 - 检索插入的记录,外键始终为空

时间:2015-12-12 19:47:19

标签: java hibernate jpa triggers derby

我的树结构实体名为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>();

在数据库中它看起来像这样: Category table

我的谱系字段也有助于列表树。 (看这里: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):

Category table2

在插入触发器之前它也不起作用:

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();

0 个答案:

没有答案