休眠:具有OnetoOne关系的重复项将保留一个列表

时间:2019-02-03 02:32:13

标签: java spring hibernate spring-boot jpa

<button>stop loop</button>
<video src="" muted="false" controls autoplay>

我有一个@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; ...} ,我想使用Spring Boot CrudRepository保持不变。

TestPair的含有试验的这些试验的是相同的沿的一些TestPair的。

当我使用saveAll方法时,它将保留对象,但是相等的Test将插入新对象,并在db中创建许多重复元素。

我已经为此类创建了equals和hashcode。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我找到了解决方法。

我没有在哈希表中使用原始的saveAll,而是一一保存。

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;
}

通过这种方式,休眠将对象合并,而不创建新对象。谢谢大家!