|
We have 2 entities: Record, FraudReport. FraudReport contains Set of Records.
If all entities are new, it works fine:
FraudReport report = new FraudReport(); report.getRecords().add(new Record()); report.getRecords().add(new Record());
If Record entities (record1, record2) already exist in database:
1. works fine
FraudReport report = new FraudReport(); Set<Record> records = new HashSet<>(); records.add(record1); records.add(record2); report.setRecords(records);
2. DOES NOT WORK
FraudReport report = new FraudReport(); report.getRecords.add(record1); report.getRecords.add(record2);
report.records - org.hibernate.collection.internal.PersistentSet All operations are done in transaction. Only record2 association is persisted to database for report. In debugger report contains both record1 and record2, after saving to database (transaction is commited) - the same. But in DB only 1 row in fraud_report_items table - report, record2.
After removing methods hashCode() and equals() it work too.
@MappedSuperclass public abstract class AEntity implements IEntity { @Id @GeneratedValue private Long id;
@Version private Long version;
@Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((id == null) ? 0 : id.hashCode()); result = prime * result + ((version == null) ? 0 : version.hashCode()); return result; }
@Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Entity other = (Entity) obj; if (id == null) { if (other.id != null) return false; }
else if (!id.equals(other.id)) return false; if (version == null) { if (other.version != null) return false; }
else if (!version.equals(other.version)) return false; return true; } }
@Entity public class Record extends AEntity { @OrderBy("reportDate desc") @ManyToMany(mappedBy = "records") private Set<FraudReport> fraudReports; }
@Entity public class FraudReport extends AEntity { @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL) @JoinTable(name = "fraud_report_items", joinColumns = @JoinColumn(name = "report_id", nullable = false), inverseJoinColumns = @JoinColumn(name = "record_id", nullable = false)) private Set<Record> records = new HashSet<>(); }
|