Как правильно ссылаться на класс из коллекции и прямой ссылки - PullRequest
0 голосов
/ 16 октября 2018

У меня есть две сущности: Box и Link.(Оба наследуются от _BaseClass, но я не думаю, что это уместно - хотя это может быть ....)

Таким образом, Box содержит link1, link2 и коллекцию ссылок.

_BaseEntity:

@MappedSuperclass
public class _BaseEntity implements Comparable<_BaseEntity> {
    @Expose //
    @Id //
    @GeneratedValue() //
    protected long id;

    public _BaseEntity() {}

    public long getID() {
        if (id == 0) return creationId;
        return id;
    }

    @Override public final int hashCode() {
        return (int) getID();
    }
    @Override public final boolean equals(final Object pObj) {
        if (pObj == null) return false;
        if (getClass() != pObj.getClass()) return false;
        final _BaseEntity other = (_BaseEntity) pObj;
        return id == other.id;
    }
    @Override public int compareTo(final _BaseEntity arg0) {
        return (int) (getID() - arg0.getID());
    }
}

Поле:

@Entity
@Table(name = "PT_Box")
public class Box extends _BaseEntity {

    @Expose private String name;

    @Expose //
    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true, mappedBy = "parent") //
    private Link link1;

    @Expose //
    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true, mappedBy = "parent") //
    private Link link2;

    @Expose //
    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true, mappedBy = "parent") //
    private final ArrayList<Link> links = new ArrayList<>();

}

Ссылка:

@Entity
@Table(name = "PT_Link")
public class Link extends _BaseEntity {

    @ManyToOne(fetch = FetchType.EAGER) //
    @JoinColumn(name = "parent_id") //
    private final Box parent; // dont expose for not looping!

    @Expose private String  name;
    @Expose private String  link;

    @Expose private Date    lastUpdate;
    @Expose private Date    nextUpdate;

}

Проблемы:

  • Ссылки запутались.'link1' и 'link2' показывают первый элемент 'link'.
  • И наоборот: если я установлю 'link1', то список 'links' покажет его как первый элемент.

Подозрение:

Я уверен, что это связано с сопоставлениями

  • Box: @OneToMany (mappedBy = "parent")
  • Ссылка: @ManyToOne @JoinColumn (name = "parent_id")

чтобы они также связывали эти ссылки с переменными 'link1' и 'link2'.

Вопрос:

Итак, мой вопрос: Как правильно управлять / аннотировать это?

  • Отменить сопоставление 'link1' и 'link2'каким-то образом?
  • Аннотировать' link1 'и' link2 'как @Transient, чтобы ссылки устанавливались только на стороне ссылки?(если это вообще работает ...)

1 Ответ

0 голосов
/ 16 октября 2018

Ваше отображение неверно.

Прежде всего, методы hashCode и equals () не должны использовать сгенерированный идентификатор.Вероятно, у вас не должно быть методов equals или hashCode.Это самый безопасный способ (см. http://docs.jboss.org/hibernate/orm/5.3/userguide/html_single/Hibernate_User_Guide.html#mapping-model-pojo-equalshashcode)

Во-вторых, коллекция должна иметь тип List, а не ArrayList.

В-третьих: вам нужно три разных столбца соединения (и, следовательно, три разных родительских поля)в сущности Ссылка:

  • чтобы узнать, в каком блоке содержится ссылка в качестве ссылки1 (OneToOne, сторона владельца ассоциации OneToOne link1)
  • , чтобы узнать, в каком поле содержится ссылкакак его ссылка2 (OneToOne, сторона владельца ассоциации OneToOne link2)
  • чтобы узнать, какое поле содержит ссылку в качестве одного из элементов списка ссылок (ManyToOne, сторона владельца ассоциации ссылок OneToMany)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...