【问题标题】:JPA - modify autogenerated link tables with timestampJPA - 使用时间戳修改自动生成的链接表
【发布时间】:2011-11-30 11:22:44
【问题描述】:

我正在寻找一种方法,在 OneToMany 关系中的两个实体之间扩展自动生成的链接表,并使用额外的时间戳列。

目标是什么? 每个实体本身都有一个时间戳,显示上次更改的时间。但是没有办法 查看所做的更改类型。我们有必要看看 Place 和 Event 之间的分配是在什么时间完成的。

@Entity
public class Place{    

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
    private final List <Event> events = new ArrayList<Event>();

    ....

}

数据库包含三个表。 PLACE、EVENT 和 PLACE_EVENT。 表 PLACE_EVENT 有两列:PLACE_ID 和 EVENT_ID。

我想要一个带有简单时间戳的第三列“已创建”。 有什么方法可以自动生成这个时间戳。我不想自己创建一个新的实体 PLACE_EVENT。

我不确定这是否可能,但我很感激任何提示。

我在 eclipselink 中使用 jpa 2.0 和一个 db2 驱动程序。

【问题讨论】:

  • JPA 不允许这种关联,如果你想在关联上有属性,你必须创建一个新实体。

标签: java jpa eclipselink


【解决方案1】:

您可以自己创建表(即不依赖于从实体自动创建模式),并添加一个默认值设置为now() 的时间戳列。

但请注意,有时(我不记得具体在哪些情况下),当 Hibernate 将新实体 B 添加到 A 时,它会从连接表中删除所有引用 A 的行并将它们全部重新插入。

另请注意,时间戳字段将填充到数据库中,但在 Hibernate 实体中不可用。只有 SQL 查询才能访问时间戳。

【讨论】:

  • 谢谢,我会考虑这个可能性的。
【解决方案2】:

如果您只想在数据库上生成时间戳,您可以使用触发器来生成它。 您还可以使用 DescriptorCustomizer 覆盖映射的 insertSQL 以包含服务器的时间戳。

如果您想要返回时间戳,那么您需要将连接表映射为一个实体,以便有一些地方来存储数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-12
    • 1970-01-01
    • 2017-11-03
    • 1970-01-01
    • 1970-01-01
    • 2010-11-01
    • 2015-09-30
    • 2018-09-20
    相关资源
    最近更新 更多