Immer Doppelte Einträge mit Hibernate

Erlebe ich ein sonderbares Problem bei der Verwendung von JPA/Hibernate. Ich sehe doppelte Einträge während der Prüfung.

Hier ist meine Klasse BaseEntity:

@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public abstract class BaseEntity {

    @Id
    @Column(name = "ID", updatable = false, nullable = false)
    @GenericGenerator(name = "uniqueIDGenerator", strategy = "org.hibernate.id.enhanced.SequenceStyleGenerator", parameters = {
            @org.hibernate.annotations.Parameter(name = "sequence_name", value = "ID_SEQUENCE"),
            @org.hibernate.annotations.Parameter(name = "increment_size", value = "100"),
            @org.hibernate.annotations.Parameter(name = "optimizer ", value = "pooled") })
    @GeneratedValue(generator = "uniqueIDGenerator")
    @NotNull
    protected int id;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

}

Hier ist meine Haupt-partner-Klasse:

@Entity
@Table(name = "partner")
public class Partner extends BaseEntity{

    @Column(name = "name")
    private String name;

    @OneToMany(mappedBy="partner", fetch=FetchType.EAGER)
    @Cascade(CascadeType.DELETE)
    private List<Receipt> receipts;

    @OneToMany(mappedBy="partner", fetch=FetchType.EAGER)
    @Cascade(CascadeType.DELETE)
    private List<Delivery> deliveries;

    public Partner() {
        setReceipts(new ArrayList<Receipt>());
        setDeliveries(new ArrayList<Delivery>());
    }

    public Partner(String name){
        this();

        this.setName(name);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List<Receipt> getReceipts() {
        return receipts;
    }

    public void setReceipts(List<Receipt> receipts) {
        this.receipts = receipts;
    }

    public List<Delivery> getDeliveries() {
        return deliveries;
    }

    public void setDeliveries(List<Delivery> deliveries) {
        this.deliveries = deliveries;
    }
}

Partner hat zwei Unterklassen, den Empfang und die Zustellung. Hier ist der Empfang Klasse:

@Entity
@Table(name = "receipt")
public class Receipt extends BaseEntity{

    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="partnerId")
    private Partner partner;

    @Column(name = "name")
    private String name;
    @Column(name = "json")
    private String json;

    @Transient
    private ReceiptContainer receiptContainer;


    public Receipt() {
    }
    public Receipt(String name){
        this();

        this.setName(name);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getJson() {
        return json;
    }

    public void setJson(String json) {
        this.json = json;
    }

    public ReceiptContainer getReceiptContainer() {
        return receiptContainer;
    }

    public void setReceiptContainer(ReceiptContainer receiptContainer) {
        this.receiptContainer = receiptContainer;
    }

    public Partner getPartner() {
        return partner;
    }

    public void setPartner(Partner partner) {
        this.partner = partner;
    }

}

Hier ist die Lieferung-Klasse:

@Entity
@Table(name = "delivery")
public class Delivery extends BaseEntity{

    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="partnerId")
    private Partner partner;

    @Column(name = "name")
    private String name;
    @Column(name = "json")
    private String json;

    @Transient
    private DeliveryContainer deliveryContainer;


    public Delivery() {
    }
    public Delivery(String name){
        this();

        this.setName(name);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getJson() {
        return json;
    }

    public void setJson(String json) {
        this.json = json;
    }

    public DeliveryContainer getDeliveryContainer() {
        return deliveryContainer;
    }

    public void setDeliveryContainer(DeliveryContainer deliveryContainer) {
        this.deliveryContainer = deliveryContainer;
    }

    public Partner getPartner() {
        return partner;
    }

    public void setPartner(Partner partner) {
        this.partner = partner;
    }

}

Bekomme ich meine Objekte wie diese:

@Transactional
public Partner get(int id){
    Partner partner = entityManager.find(Partner.class, id);
    return partner;
}

Wie Sie sehen können, die partner-Klasse enthält eine Liste von Objekten und eine Liste von Objekten, die gespeichert sind in eigenen Tabellen, den Empfang und die Zustellung bzw.

---Bevor ich weiter gehen, würde ich mag zu beachten, dass die korrekte Anzahl der Einträge in der Datenbank. Dieses Problem tritt nur auf, wenn du die Objekte in meiner Java app.---

Wenn ich ein Objekt und keine Objekte vorhanden sind, ein Objekt angezeigt wird und keine Objekte angezeigt werden, die zu erwarten ist. Wenn ein Objekt und ein Objekte existieren, die ein Objekt und ein Objekt angezeigt werden, wieder, was zu erwarten ist. Das problem tritt auf, wenn mehr als ein oder-Objekt vorhanden sind. Zum Beispiel, wenn zwei Objekte Hinzugefügt werden, sondern nur ein Objekt Hinzugefügt wird, zwei Objekte UND zwei Objekte angezeigt werden.

Besser zu veranschaulichen, finden Sie unter meine test-case-Tabelle beschrieben. Unerwartete Ergebnisse sind umgeben mit Bindestrichen.

<Receipt> Obj Added | <Delivery> Obj Added | <Receipt> Obj Displayed | <Delivery> Obj Displayed
         0          |          0           |           0             |            0
         0          |          1           |           0             |            1
         1          |          0           |           1             |            0
         1          |          1           |           1             |            1
         1          |          2           |        ---2---          |         ---2---
         2          |          1           |        ---2---          |         ---2---
         2          |          2           |        ---4---          |         ---4---

Meine Frage ist, warum sehe ich diese unerwarteten Ergebnisse?

  • Brauchen Sie ein paar Stücke von Informationen zu helfen: zeigen, wie erzeugen Sie die ID für diese Klassen (post Ihre Klasse baseentity), zeigen, wie Sie sind, speichern und abrufen der Daten
  • Gerade Hinzugefügt, danke
InformationsquelleAutor user1472409 | 2014-11-05
Schreibe einen Kommentar