【问题标题】:Reference a table in JPA引用 JPA 中的表
【发布时间】:2018-09-12 14:10:00
【问题描述】:

我对 JPA 和休眠有一个问题,我无法弄清楚。 我有两个带有数据的单独实体,我想从 table1 读取/写入数据到 table2。

表 1

@Entity
@Table(name = "table1")
@Data
public class Table1{

    @ManyToMany(cascade = {
        CascadeType.PERSIST,
        CascadeType.MERGE
    })
    @JoinTable(
        name = "table2",
        joinColumns = @JoinColumn(name = "tableId", referencedColumnName =  "id"))
    private List<Table2> data = new ArrayList<>();
}

表 2

@Entity
@Table(name = "table2")
@Data
public class Table2{

    private String name;
    private String address;
}

因此,每当我更新 table1 并且它包含名称和地址时,我都想将其写入 table2,并且当获取表 1 时,我想将列表中的所有名称和地址与对象一起提供。如何使用 JPA 和 Hibernate 实现这一目标?

【问题讨论】:

  • 您已经描述了您的目标,但我不知道您在实现该目标时遇到了什么问题。
  • 您的要求可以使用数据库触发器来完成。 JPA 中的等效功能是通过“实体生命周期事件”和“实体监听器”提供的。我建议坚持使用 DB 触发器,因为如果表上的操作不是通过 JPA 即 CLI 中的 SQL 查询,则不会触发 JPA 事件。
  • JPA 不适用于将数据从一个表复制到另一个表。一张表代表一类,另一张表代表另一类。创建不同类型的对象以将数据放入相应的表中。由于您不发布您正在尝试的内容,因此猜测毫无意义

标签: java hibernate jpa


【解决方案1】:

我相信您正在尝试做的是一对多关系,而不是多对多,如您的注释中所示。多对多关系是当您使用第三个表连接这两个表时,这两个表只有两个表的 id 对。

@Entity
@Table(name = "table1")
@Data
public class Table1{

    @OneToMany(cascade = {
        CascadeType.PERSIST,
        CascadeType.MERGE
    }, orphanRemoval = true)
    private List<Table2> data = new ArrayList<>();
}

需要在Table2中引用Table1对象

@Entity
@Table(name = "table2")
@Data
public class Table2{

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "table1_id")
    private Table1 owner;

    private String name;
    private String address;
}

我添加了orphanRemoval = true,因为没有它,人们经常会感到困惑,他们已经从列表中删除了某些内容,但下次他们获取数据时它仍然存在。这是 JPA 规范在 2.1 版之前遗漏的东西。

【讨论】:

    猜你喜欢
    • 2015-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多