Задать вопрос
@acwartz
Тут должна быть ваша реклама.

Как к entity присоединить список других entity и потом работать с ними и со списком?

Привет!

Есть сертификат(Certificate), у него может быть много тегов (Tag).

Собственно хотелось бы понять как мне теперь через класс конкретного Certificate работать с его тегами? Получить всего его теги, изменить один/несколько? Добавить/удалить новый и т.д.
Методы для этого вроде как завел, на самом деле до jpa там были списки чтобы RestController хоть что-то выдал и можно было записать/прочитать в run-time что-то.
Как туда репозиторий тегов приклеить - ума не приложу.

репозиторий тут

базовые поля

....
@MappedSuperclass
public abstract class CommonFields implements Serializable {
	
	private static final long serialVersionUID = 5618898539406697796L;

	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	@JsonProperty("id")
	@Column(name = "id", nullable = false)
	private long id;

	@JsonProperty("name")
	@Column(name = "name", nullable = true)
	private String name;

	@JsonProperty("dateCreated")
	@Column(name = "dateCreated", nullable = false)
	private ZonedDateTime dateCreated;

	@JsonProperty("dateUpdated")
	@Column(name = "dateUpdated", nullable = false)
	private ZonedDateTime dateUpdated;

}
...



Сертификат

package by.alex.certws.domain;

@JsonSerialize
@Entity
@Table(name = "certificates")
public class Certificate extends CommonFields {
	
	private static final long serialVersionUID = -3444580092047125843L;
	
	@JsonProperty("content")
	private String content;

	@JsonProperty("tags")
	@OneToMany(targetEntity=Tag.class, mappedBy="id",cascade=CascadeType.ALL, fetch = FetchType.LAZY)    
	private List<Tag> tags = new ArrayList<>();

	public Certificate() {
		super();
	}

	public Certificate(long certId, String certName) {
		super(certId, certName);
	}

	public Certificate(long certId, String certName, String content) {
		super(certId, certName);
		this.setContent(content);
	}

	public Certificate(long id, String name, String content, String[] tags) {
		super(id, name);
		this.setContent(content);
		for (String tag : tags) {
			addTag(tag);
		}
	}

	public String getContent() {
		return this.content;
	}

	public void setContent(String target) {
		this.content = target;
		this.UpdateNotify();
	}

	public List<Tag> getTags() {
		return this.tags;
	}

	public Optional<Tag> findTagByName(String name) {
		return this.tags.stream().filter(Objects::nonNull)
				.filter(t -> (Objects.nonNull(t.getName()) && t.getName().compareTo(name) == 0)).findAny();
	}

	public long addTag(String tagName) {
		Optional<Tag> match = this.findTagByName(tagName);
		if (match.isPresent()) {
			return match.get().getId();
			// throw new ETagExistsException();
		} else {
			return 0;
		}
	}

	public Boolean removeTag(String target) {
		Optional<Tag> match = this.findTagByName(target);
		if (match.isPresent()) {
			return this.tags.remove(match.get());
		} else {
			// TODO: MUST throw exception
			return false;
		}
	}

}



Тег

package by.alex.certws.domain;

....

@Entity
@Table(name = "tags")
public class Tag extends CommonFields {
	
	@JsonProperty("references")
	@OneToMany(targetEntity=Certificate.class, mappedBy="id",cascade=CascadeType.ALL, fetch = FetchType.LAZY)    
	private List<Certificate> refs = new ArrayList<>();
	
	private static final long serialVersionUID = -2535451222904563266L;

	public Tag() {
		super();
	}

	public Tag(long id, String name) {
		super(id, name);
	}
	
	List<Certificate> getReferences() {
		return this.refs;
	}

}



Так же есть интерфейсы
public interface CertificatesRepository extends PagingAndSortingRepository<Certificate, Long> {}
...
public interface TagsRepository extends PagingAndSortingRepository<Tag, Long> {}


Предполагается что в таблице тегов может быть куча дубликатов по имени, т.е. 3 сертификата могут иметь один и тот же тег "Java" ну или как-то так.
Ещё не совсем понял как и почему, но обычно к такой таблице я руками создаю tagsIDS где собственно будет жить связь Autokey, Certificate.id = Tag.id и вот её-то и нет.
но тут все через.... автоматизацию/упрощение и преобразование классов и свойств в sql и т.д.
  • Вопрос задан
  • 57 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
azerphoenix
@azerphoenix Куратор тега Java
Java Software Engineer
Добрый день!
Во-первых, на основании ваших слов:
Есть сертификат(Certificate), у него может быть много тегов (Tag).
Предполагается что в таблице тегов может быть куча дубликатов по имени, т.е. 3 сертификата могут иметь один и тот же тег "Java" ну или как-то так.

Могу предположить, что связь OneToMany & ManyToOne не очень подходит.
Вот, смотрите: один сертификат может иметь несколько тегов, но при этом один тег может относится к разным сертификатам. Тут явно связь ManyToMany.
https://vladmihalcea.com/the-best-way-to-use-the-m...
https://www.baeldung.com/jpa-many-to-many
Соответственно, получится, что со стороны Certificate вы сможете получить список его тегов, а со тороны тега, можете получить список сертификатов, к которым он принадлежит.
А то у вас получается, что и со стороны тега и сертификата OneToMany связь, но при этом с обеих сторон используется List
При использовании ManyToMany будет создана новая таблица вида certificate_id | tag_id, где вы сможете хранить данные. И соответственно,
Как к entity присоединить список других entity и потом работать с ними и со списком?

Этот вопрос устранится само собой
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы