Hallo,
ich habe einen Bean, der in einer ManyToMany Beziehung zu einemanderen Bean steht.
Dazu verwende ich ein Set, wie auf einer Seite ich es empfohlen bekam. Das ganze funktioniert ganz prima.
Nun wollte ich keine undeterministische Reihenfolge beim auflisten der Elemente haben, und wandelte das ganze zu einem SortedSet
für zumindest einen der Beans.
Nun bekomme ich in einen der automatisierten Tests von Spring folgenden Fehler
Caused by: org.hibernate.AnnotationException: A sorted collection must define and ordering or sorting : de.cmk.todo.restservices.staffmanager.Mitarbeiter.skills
Mir ist nicht ganz klar was ich da nun machen soll, ich habe doch einen netten Comparator für das TreeSet gebastelt, wo ist das Problem und was muss man da machen?
h
[CODE lang="java" title="Mitarbeiter.java"]import java.util.Comparator;
import java.util.SortedSet;
import java.util.TreeSet;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinTable;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import de.cmk.todo.restservices.skillmanager.Skill;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
@Data
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name= "\"mitarbeiter\"", schema = "\"projekt-skill-verwalter\"")
public class Mitarbeiter {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "staff_generator")
@SequenceGenerator(name="staff_generator", sequenceName = "projekt-skill-verwalter.seq_mitarbeiter", allocationSize=1)
@EqualsAndHashCode.Include
@Column(name="mitarbeiter_id")
private Long id;
@Column(name="vorname")
@JsonProperty("firstname")
private String vorName;
@Column(name="nachname")
@JsonProperty("familyname")
private String nachName;
@JsonIgnoreProperties("mitarbeiter")
@ManyToMany(fetch = FetchType.LAZY, cascade = { CascadeType.PERSIST, CascadeType.DETACH })
@JoinTable(name = "skill_mitarbeiter",
joinColumns = {
@JoinColumn(name = "mitarbeiter_id", referencedColumnName = "mitarbeiter_id",
nullable = false, updatable = false)},
inverseJoinColumns = {
@JoinColumn(name = "skill_id", referencedColumnName = "skill_id",
nullable = false, updatable = false)})
private final SortedSet<Skill> skills = new TreeSet<>(new Comparator<>() {
@Override
public int compare(Skill o1, Skill o2) {
int rc = 0;
if (o1!=null)
{
if (o2!=null)
{
rc = o1.getName().compareTo(o2.getName());
}
else
{
rc = 1;
}
}
else if (o2!=null)
{
rc = -1;
}
else
{
rc =0;
}
return rc;
}
});[/CODE]
Interessanterweise, wenn ich aus dem SortedSet wieder ein Set mache, und es bei dem sortierten TreeSet belasse, bekomme ich zwar was gerell funktionierendes, aber die Reihenfolge der Skills ist auch wieder nicht vorhersehbar.
ich habe einen Bean, der in einer ManyToMany Beziehung zu einemanderen Bean steht.
Dazu verwende ich ein Set, wie auf einer Seite ich es empfohlen bekam. Das ganze funktioniert ganz prima.
Nun wollte ich keine undeterministische Reihenfolge beim auflisten der Elemente haben, und wandelte das ganze zu einem SortedSet
für zumindest einen der Beans.
Nun bekomme ich in einen der automatisierten Tests von Spring folgenden Fehler
Caused by: org.hibernate.AnnotationException: A sorted collection must define and ordering or sorting : de.cmk.todo.restservices.staffmanager.Mitarbeiter.skills
Mir ist nicht ganz klar was ich da nun machen soll, ich habe doch einen netten Comparator für das TreeSet gebastelt, wo ist das Problem und was muss man da machen?
h
[CODE lang="java" title="Mitarbeiter.java"]import java.util.Comparator;
import java.util.SortedSet;
import java.util.TreeSet;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinTable;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import de.cmk.todo.restservices.skillmanager.Skill;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
@Data
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name= "\"mitarbeiter\"", schema = "\"projekt-skill-verwalter\"")
public class Mitarbeiter {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "staff_generator")
@SequenceGenerator(name="staff_generator", sequenceName = "projekt-skill-verwalter.seq_mitarbeiter", allocationSize=1)
@EqualsAndHashCode.Include
@Column(name="mitarbeiter_id")
private Long id;
@Column(name="vorname")
@JsonProperty("firstname")
private String vorName;
@Column(name="nachname")
@JsonProperty("familyname")
private String nachName;
@JsonIgnoreProperties("mitarbeiter")
@ManyToMany(fetch = FetchType.LAZY, cascade = { CascadeType.PERSIST, CascadeType.DETACH })
@JoinTable(name = "skill_mitarbeiter",
joinColumns = {
@JoinColumn(name = "mitarbeiter_id", referencedColumnName = "mitarbeiter_id",
nullable = false, updatable = false)},
inverseJoinColumns = {
@JoinColumn(name = "skill_id", referencedColumnName = "skill_id",
nullable = false, updatable = false)})
private final SortedSet<Skill> skills = new TreeSet<>(new Comparator<>() {
@Override
public int compare(Skill o1, Skill o2) {
int rc = 0;
if (o1!=null)
{
if (o2!=null)
{
rc = o1.getName().compareTo(o2.getName());
}
else
{
rc = 1;
}
}
else if (o2!=null)
{
rc = -1;
}
else
{
rc =0;
}
return rc;
}
});[/CODE]
Interessanterweise, wenn ich aus dem SortedSet wieder ein Set mache, und es bei dem sortierten TreeSet belasse, bekomme ich zwar was gerell funktionierendes, aber die Reihenfolge der Skills ist auch wieder nicht vorhersehbar.
Zuletzt bearbeitet: