如何使用Spring Data JPA更新实体中的集合字段? - java

假设我有两个实体,它们的字段之间具有@ManyToMany关系。
第一个实体称为Pack:

@ManyToMany(fetch = FetchType.EAGER, cascade = {CascadeType.ALL})
    @JoinTable(name = "card_in_pack",
            joinColumns = {@JoinColumn(name = "pack_id")},
            inverseJoinColumns = {@JoinColumn(name = "card_id")})
    private Set<Card> cards = new HashSet<>();

第二个叫Card:

@ManyToMany(mappedBy = "cards")
private Set<Pack> packs = new HashSet<>();

我有一个控制器,我想在其中添加新的Card实体到Pack实体中的集合,然后我想通过关系将其全部保存到我的数据库中。

@PostMapping("/packs/{namePack}")
    public String addCard(@Valid Card card, @PathVariable String namePack, @AuthenticationPrincipal User user) {
            //Assume I got a Pack instance with name pack

            card.setAuthor(user);
            pack.addCard(card);
            packRepo.save(pack);

            return "pack";
        }
    }

看起来像每次我尝试调用packRepo.save(pack)方法时,它都会使用Pack实体中的所有Card实体,并将所有这些Card实体保存为新的,即使其中一些已经存在于我的数据库中。我希望它检查Pack实体是否具有一组纸牌实体,它应该检查DB中是否已存在具有这种ID的每张纸牌,并仅添加新的。我尝试清除集合,然后仅添加要保存的新元素,但随后它仅从数据库中删除了所有不在当前打包状态的元素,而仅添加了新元素

我想要保存与@ManyToMany相关的Set的最好方法,这样就不会在数据库中创建新的重复实例

参考方案

我拿到背包的方式真的很糟糕,我什至不会告诉你)

有用的是:将所有存储库逻辑从控制器移动到服务,并使用@transactional批注对其进行标记!

Spring Data Cassandra的事务管理 - java

我正在使用Spring和Cassandra作为基础数据库。曾提到过弹簧伞项目“ spring data cassandra”。与休眠不同,在这里无法找到如何管理事务。如果您中的某些人已经合并,请共享要包含的事务管理器的详细信息。 参考方案 Cassandra不支持传统(ACID)的事务。在某些特殊情况下,可以通过一些构造来实现事务原子性,例如原子批处理(请参…

合并两个HashTable并删除Java中的重复项 - java

我有两个带有<int,string>对的哈希表。现在它们每个都有重复的值,我想合并两个哈希表以给我不同的值。我怎样才能做到这一点!?谢谢编辑#1我正在从目录中读取文件内容。并将这些内容作为令牌存储在两个不同的哈希表中。现在,我需要将它们合并到单个哈希表中,这将为我提供两个表的不同值。 参考方案 您可以使用putAll的Hashtable方法合并两…

JAVA:字节码和二进制有什么区别? - java

java字节代码(已编译的语言,也称为目标代码)与机器代码(当前计算机的本机代码)之间有什么区别?我读过一些书,他们将字节码称为二进制指令,但我不知道为什么。 参考方案 字节码是独立于平台的,在Windows中运行的编译器编译的字节码仍将在linux / unix / mac中运行。机器代码是特定于平台的,如果在Windows x86中编译,则它将仅在Win…

java:继承 - java

有哪些替代继承的方法? java大神给出的解决方案 有效的Java:偏重于继承而不是继承。 (这实际上也来自“四人帮”)。他提出的理由是,如果扩展类未明确设计为继承,则继承会引起很多不正常的副作用。例如,对super.someMethod()的任何调用都可以引导您通过未知代码的意外路径。取而代之的是,持有对本来应该扩展的类的引用,然后委托给它。这是与Eric…

Java:BigInteger,如何通过OutputStream编写它 - java

我想将BigInteger写入文件。做这个的最好方式是什么。当然,我想从输入流中读取(使用程序,而不是人工)。我必须使用ObjectOutputStream还是有更好的方法?目的是使用尽可能少的字节。谢谢马丁 参考方案 Java序列化(ObjectOutputStream / ObjectInputStream)是将对象序列化为八位字节序列的一种通用方法。但…