Привет!
Есть сертификат(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 и т.д.