当前位置: 首页 > 知识库问答 >
问题:

在JPA / JPQL中直接将行插入连接表?

宓和同
2023-03-14

JPA中有没有一种方法可以将行直接插入到连接表中?我有以下合同和附件实体:

public class Contract implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Long id;

    @Version
    @Column(name = "version")
    private Integer version;

    private String number;
    private String volume;

    @ManyToMany
    @JoinTable(joinColumns = @JoinColumn(name = "contract_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "attachment_id", referencedColumnName = "id"))
    private List<Attachment> attachments;
}

< code >附件实体:

public class Attachment implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Long id;

    @Version
    @Column(name = "version")
    private Integer version;

    private String name;
}

由于线程并发问题,我想直接向合约添加附件,而无需加载合约,将附件添加到列表中并保留/保存合约,因为 Contract 对象本身中没有正在更新的数据。为了更详细一些,我有多个线程并行保存附件,如果我要在所有这些线程中持久化合约,我需要加入某种并发控制以避免乐观锁定异常。鉴于 Contract 实体未被修改(只有连接表被修改),我不想设置瓶颈,而只是直接更新连接表。

在JPA和/或JPQL中有没有一种方法可以将行直接插入到连接表中?工作流程是持久化附件,然后将适当的行插入到连接表中。

有办法从实体中检索JPA生成的连接表名称吗?

断续器:

CREATE TABLE `contract` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `number` varchar(255) DEFAULT NULL,
  `volume` varchar(255) DEFAULT NULL,
  `version` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;


CREATE TABLE `attachment` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `version` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
) ENGINE=InnoDB AUTO_INCREMENT=197 DEFAULT CHARSET=utf8;


CREATE TABLE `contract_attachment` (
  `contract_id` bigint(20) NOT NULL,
  `attachment_id` bigint(20) NOT NULL,
  UNIQUE KEY `UK_27094bpt88d7bfngq5v52jrs` (`attachment_id`),
  KEY `FK_i1ycj6ewd536bky08t0jjh15d` (`contract_id`),
  CONSTRAINT `FK_i1ycj6ewd536bky08t0jjh15d` FOREIGN KEY (`contract_id`) REFERENCES `contract` (`id`),
  CONSTRAINT `FK_27094bpt88d7bfngq5v52jrs` FOREIGN KEY (`attachment_id`) REFERENCES `attachment` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

共有1个答案

徐弘图
2023-03-14

看起来您需要将级联属性添加到@ManyToMany注释中。使用PERSIST或ALL
但这确实不是很清楚的描述,您说您不想加载Contract,但您将如何在不加载的情况下持久化/保存Contract?

如果你真的不想加载合约而只是坚持附件,你需要添加@ManyToMany关系到你的附件。然后添加合约(您仍然需要加载它,但不需要使其保持最新状态)。它应该是这样的:

@ManyToMany
@JoinTable(joinColumns = @JoinColumn(name = "attachment_id", referencedColumnName = "id"), inverseJoinColumns =  @JoinColumn(name = "contract_id", referencedColumnName = "id"))
private List<Contract> contracts;
 类似资料:
  • 问题内容: 我想知道,将PHP变量插入字符串的正确方法是什么? 这条路: 或者这样: 这两种方法都可以在我的电脑上使用。后者更短,更简单,但是我不确定第一种格式是否更好或是否被认为更合适。 问题答案: 在这两种语法之间,您应该真正选择一种您喜欢的语法:-) 就个人而言,在这种情况下 (可变插值) ,我会采用您的第二个解决方案,我发现它更容易写和读。 结果将是相同的;即使有性能影响,也没关系1。 作

  • 我有一些docker conatiner,现在我想用ssh进入一个。我通过ssh连接到了docker容器。 但是现在我有一个问题,我不知道我可以用哪个用户访问这个容器? 我在主机(web)上的两个用户中都尝试过

  • AWS Direct Connect允许从我们的网络到AWS位置创建专用网络连接。 它使用802.1q VLAN,可以将其划分为多个虚拟接口,以使用相同的连接访问公共资源。 这导致网络成本降低和带宽增加。 可以根据需要随时重新配置虚拟接口。 使用AWS Direct Connect的要求 我们的网络必须满足以下条件之一才能使用AWS Direct Connect - 我们的网络应位于AWS Dir

  • 直接插入排序的基本思想是:将 n 个有序数存放在数组 a 中,要插入的数为 x,首先确定 x 插在数组中的位置 p,然后将 p 之后的元素都向后移一个位置,空出 a(p),将 x 放入 a(p),这样可实现插入 x 后仍然有序。 例 1 本例子通过直接插入的方法对上述例子中的 number 数组进行排序。创建一个 Test27 类文件,在 main() 方法中开始编码,具体实现代码如下: 在上述代

  • 直接插入排序是比较简单的排序算法,它主要是将我们要排序的序列分成两个部分,一个有序一个无序,然后将无序序列中的值依次插入到有序序列中。 这么讲如果不能理解,我们拿例子去讲,假如有序列8 7 2 1 5 9 3这么一个序列,如下表所示。我们要将这个序列进行升序排序,接下来演示插入排序的过程。 初始序列 8 7 2 1 5 9 3 第一次排序 从前往后排,将8作为我们的有序序列的第一个值,而8后面的值

  • 问题内容: 我以为我知道该如何使用,但显然不知道如何使用。谁能帮我? 这给我例外 与拥有OneToMany关系。 我的第二个问题是,说此查询返回唯一的结果,那么如果我这样做 代表上面的查询名称。那么,将其串联在一起还是会得到回报? 问题答案: JPQL中的一对多关系如下所示: 在子句中指定多个属性时,结果返回为: 顺便说一下,为什么您的实体以复数形式命名,这令人困惑。如果要使用复数形式的表名,则可