2 Stimmen

Beseitigung redundanter Verweise auf den Eigentümer in JPA

Ich habe diese Entitäten in JPA + Hibernate, Player y AvatarAttributeOwnership . Ersteres hat eine Set des letzteren, der definiert, welche Avatarattribute er besitzt.

@Entity
public class Player implements Serializable {

    @Id
    @GeneratedValue
    private long id;

    @OneToMany(fetch=FetchType.LAZY,mappedBy="owner",cascade=CascadeType.ALL)
    private Set<AvatarAttributeOwnership> ownedAvatarAttributes;

    ...

}

@Entity
@Table(uniqueConstraints=@UniqueConstraint(columnNames={"owner","gender","type","attrId"}))
public class AvatarAttributeOwnership implements Serializable {

    @Id
    @GeneratedValue
    @SuppressWarnings("unused")
    private long id;

    @ManyToOne
    @JoinColumn(name="owner")
    private Player owner;

    // these three columns define the attribute (i.e. are attribute's key)
    @Column
    private String attrId;

    @Column
    private String gender;

    @Column
    private String type;

    @Column
    private Date ownedSince;

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + attrId.hashCode();
        result = prime * result + gender.hashCode();
        result = prime * result + owner.hashCode();
        result = prime * result + type.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;

        AvatarAttributeOwnership other = (AvatarAttributeOwnership) obj;

        if (!attrId.equals(other.attrId)) return false;
        if (gender != other.gender) return false;
        if (!owner.equals(other.owner)) return false;
        if (!type.equals(other.type)) return false;

        return true;
    }

}

AvatarAttributeOwnerships werden auf diese Weise erstellt:

                player = em.find(Player.class, playerId);
                player.getAvatarAttributeOwnership().add(new AvatarAttributeOwnership(player, attrId, gender, type, new Date())); 
                em.persist(player);

Kann ich den Verweis auf den Eigentümer in AvatarAttributeOwnership und dabei die dort definierte eindeutige Einschränkung beibehalten?

0voto

Jihed Amine Punkte 2149

Das können Sie, indem Sie eine unidirektionale Viele-zu-Eins-Verknüpfung definieren. Dadurch wird eine Join-Tabelle mit einer Spalte für die ID des Besitzers (in Ihrem Fall Player) und einer weiteren Spalte mit der ID der Kinder (AvatarAttributeOwnership) erzeugt. Siehe http://docs.jboss.org/hibernate/core/3.3/reference/en/html/associations.html#assoc-unidirectional-join-12m für die Erklärung (beachten Sie das unique=true in der Zuordnung)

0voto

Robin Punkte 2976

Zur Definition einer eindeutigen Einschränkung für die Spalte ' order ' muss diese Spalte natürlich in der entsprechenden Tabelle vorhanden sein. Sie können die Referenz also nicht loswerden y behalten Sie die Einschränkung bei.
Sie könnten nur den Primärschlüssel von Player en AvatarAttributeOwnership aber warum sollten Sie? Falls du dich über den Overhead beim Laden einer Player-Instanz für die Erstellung einer AvatarAttributeOwnership-Instanz wunderst: du könntest immer em.getReference(Player.class, playerId) statt einer echten Player-Instanz, die keine Datenbankauswahl auslöst, es sei denn, Sie greifen im Konstruktor von AvatarAttributeOwnership auf einen Player-Status zu.

0voto

Bart van Heukelom Punkte 41768

Es stellte sich heraus, dass das, was ich wirklich wollte, die Herstellung von AvatarAttributeOwnership @Embeddable .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X