休眠:重复的项目进行OnetoOne关系持续列表

问题描述 投票:0回答:2
@Entity
public class TestPair implements Serializable {

    @Id
    @GeneratedValue(strategy= GenerationType.AUTO)
    private Long id;
    @OneToOne(cascade = {CascadeType.ALL})
    @JsonProperty("target_Test")
    private Test targetTest;
    @OneToOne(cascade = {CascadeType.ALL})
    @JsonProperty("source_Test")
        private Test sourceTest;
...}

@Entity
public class Test {
    @Id
    @GeneratedValue(strategy= GenerationType.AUTO)
    private Long id;
    private String name;
    private String shortname;
...}

我有我想用弹簧启动CrudRepository坚持一个List<TestPair>

TestPair的包含测试的这些测试的是沿着一些TestPair的相同。

当我用白水回收方法,它坚持认为是相等的它插入新的对象,但测试的,创建大量重复的分贝元素。

我已经创建了这个类的equals和hashCode。

java spring hibernate spring-boot jpa
2个回答
0
投票

检查自动生成逻辑两者的ID。如果是自动增量,那么所有的创建的实体将是不同的,因此新的条目越来越创建每次。


0
投票

我已经找到了解决办法。

除了使用CRUD白水的一个HashSet,我保留一个接一个。

for(TestPair tPair : TPairs){
    testRepository.save(tPair.getSourceTest());
    testRepository.save(tPair.getTargetTest());
    testPairRepository.save(tPair);
}

并改变了类:

@Entity
public class TestPair implements Serializable {

    @Id
    @GeneratedValue(strategy= GenerationType.AUTO)
    private Long id;
    @OneToOne(cascade = {CascadeType.MERGE})
    @JsonProperty("target_Test")
    private Test targetTest;
    @OneToOne(cascade = {CascadeType.MERGE})
    @JsonProperty("source_Test")
    private Test sourceTest;
}

@Entity
public class Test {
    private String name;
    @Id
    private String shortname;
}

这样,休眠合并的对象,而不是创造新的。谢谢你们!

© www.soinside.com 2019 - 2024. All rights reserved.