Hibernate @ManyToOne на не первичных ключах родительских сущностей, также выбирающих родительские сущности - PullRequest
1 голос
/ 14 марта 2019

Столкновение со странной проблемой при использовании @ManyToOne для неосновных ключей родительских объектов. Когда я выбираю дочернюю сущность, hibernate тоже извлекает родительскую сущность, даже если ее просят лениво выбрать, и я ничего не запрашивал у родительской сущности.

Вот пример сущности, которую я использую

Свойство Entity - это родительский объект, у которого есть столбец property_id и он не является первичным ключом.

public class Property extends AbstractEntity implements Serializable {

private static final long serialVersionUID = 8412320472079820864L;

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

@Column(name = "property_id")
public Long propertyId;

@NotNull(message = "Name can't be null")
@Size(max = 100)
@Column(name = "name")
public String name;

Теперь у меня есть объект Room, который сопоставлен с объектом Property с помощью столбца property_id.

public class Room extends AbstractEntity implements Serializable {

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

@Column(name = "name")
private String name;

@Column(name = "size")
private String size;

@Column(name = "room_type")
private RoomType roomType = RoomType.STANDARD_ROOM;

@ManyToOne(targetEntity = Property.class, fetch = FetchType.LAZY)
@JoinColumn(name = "property_id", referencedColumnName = "property_id", nullable = false)
private Property property;

@Column(name = "priority")
private Integer priority;

Теперь, когда я выбираю Комнату, Hibernate попадает в базу данных, чтобы получить свойство тоже.

Может кто-нибудь объяснить, что мне не хватает?

Я пытался реализовать перехватчик, но все же не повезло

@ManyToOne(fetch = FetchType.LAZY,optional = false)
@JoinColumn(name = "property_id", referencedColumnName = "property_id", insertable = false, updatable = false)
@LazyToOne(LazyToOneOption.NO_PROXY)
public Property getProperty() {
    if (interceptor != null) {
        return (Property) interceptor.readObject(this, "property", property);
    }
    return property;
}

public void setProperty(Property property) {
    if (interceptor != null) {
        this.property = (Property)interceptor.writeObject(this, "property", this.property, property);
        return;
    }
    this.property = property;
}

P.s: Я тоже пытался использовать аннотацию @NaturalId, но она не сработала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...