неверный UUID (первичный ключ) передается из репозитория Spring с типом fetch LAZY и @ManyToOne - PullRequest
0 голосов
/ 03 января 2019

У меня странное поведение, когда я выбираю сущность, которая является чем-то вроде «родителя» для другой сущности. Это мои классы сущностей:

Родительский объект ("одна сторона")

package so.lazy;

import java.util.LinkedHashSet;
import java.util.Set;
import javax.persistence.Entity;
import javax.persistence.OneToMany;

@Entity
public class Parent extends Base {

    private static final long serialVersionUID = -1111542804002616234L;

    @OneToMany(mappedBy = "one")
    private Set<Child> children = new LinkedHashSet<Child>();

    // more fields

    public Set<Child> getChildren() {
        return children;
    }

    public void setChildren(Set<Child> children) {
        this.children = children;
    }

    @Override
    public String toString() {
        return "Parent{" +
                "dataId=" + getDataId() +
                '}';
    }
    // more getters and setters
}

Дочерняя сущность ("много сторон")

package so.lazy;

import javax.persistence.*;

@Entity
public class Child extends Base {

    private static final long serialVersionUID = -8798542804002616234L;

    @ManyToOne(fetch = FetchType.LAZY)
    private Parent parent;

    // more fields

    public Parent getParent() {
        return parent;
    }

    public void setParent(Parent parent) {
        this.parent = parent;
    }
    // more getters and setters
}

Аннотация Базовый класс

package so.lazy;

import java.io.Serializable;
import java.util.UUID;
import javax.persistence.*;

import org.hibernate.annotations.Type;

@MappedSuperclass
public abstract class Base implements Serializable {
    @Id
    @Column(name = "data_id")
    @Type(type = "pg-uuid")
    private java.util.UUID dataId;

    public Base() {
        dataId = UUID.randomUUID();  // production: com.fasterxml.uuid.generators UUID Type 1
    }

    public UUID getDataId() {
        return dataId;
    }

    public void setDataId(UUID dataId) {
        this.dataId = dataId;
    }
}

Когда я использую этот код:

Child child=childrepository.findOne(uuid);
Parent parent=child.getParent();

System.out.println("Parent: " + parent.toString());        // Output A
System.out.println("ID in parent: " + parent.getDataId);   // Output B

Выход содержит два совершенно разных UUID для родителя в выходах A и B.
Метод Parent#toString() дает правильный UUID, получатель дает неправильный UUID.

ПОЧЕМУ ???

Если я переключаюсь на @ManyToOne(fetch = FetchType.EAGER) для parent в Child, он работает нормально.

Мои зависимости:
Пружина 4.3.8
Spring DataJPA 1.11.0
PostgreSQL 9.4-1202-jdbc42

...