UniqueConstrained & ManyToOne ?!

T

tuxedo

Gast
Hallo zusammen,

hab hier ein kleines Problem:

Ich hab zwei Entities:

Java:
@Entity
@Table(uniqueConstraints={@UniqueConstraint(columnNames={"service"})})
public class EmService implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.TABLE)
    private Long id;

    private String service;

    @OneToMany(mappedBy="service")
    private List<EmServiceMethod> methods = new ArrayList<EmServiceMethod>();

    // getter und setter

}

Java:
@Entity
@Table(uniqueConstraints={@UniqueConstraint(columnNames={"method", "service"})})
public class EmServiceMethod implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.TABLE)
    private Long id;

    private String method;

    @ManyToOne(optional=false)
    private EmService service;

    // getter und setter

}

Service hat einen Namen, und kann mehrere "Methoden" haben.
Die Methoden haben auch einen Methodennamen und können genau einem Service angehören.
Beides soll/ist "bidirectional" ausgelegt (sein).

Nun, von dern Services will ich keine doppelten haben. Also hab ich den Service Namen als "unique constraint" definiert. -> Funktioniert.
Und da ich die Services auch einzeln, getrennt von den Methoden haben will, hab ich das eben als extra Entitiy angelegt und mit der Entity für die Methoden verknüpft.

Methodennamen dürfen prinzipiell schon doppelt auftreten. Aber nicht innerhalb eines Service.

Das hier wäre okay:

meinService1.meineMethode1
meinService1.meineMethode2
meinService2.meineMethode1
meinService2.meineMethode2


Das hier nicht:

meinService1.meineMethode1
meinService1.meineMethode1


JPA mag es aber scheinbar nicht wenn man eine ManyToOne Beziehung auch noch als "unique constraint" macht. Ich bekomm ne Fehlermeldung:

Caused by: org.hibernate.AnnotationException: Unable to create unique key constraint (method, service) on table EmServiceMethod: service not found

Gibt da einen Weg drum rum? Oder muss ich das zwingend ganz anders aufbauen?!
 
T

tuxedo

Gast
So, ich glaub ich hab eine Lösung gefunden.

Ich hab mal geschaut wie Hibernate die Tabelle für EmServiceMethod anlegt.

Die Spalte die die ManyToOne Beziehung definiert legt Hibernate mit "service_id" an. Also passt das nicht auf den Namen des Feldes in der Entity.

Wenn man nun die Exception anschaut die ich bekommen hab, heisst es ja: Kann Spalte "service" nicht finden. Leutet ja nun ein.

Also schnell gegoogelt wie man den Spaltennamen einer ManyToOne Beziehhung beeinflussen kann:

Java:
    @ManyToOne(optional=false)
    @JoinColumn(name="serviceid", nullable=false)
    private EmService service;

damit forciert man JPA die Spalte "serviceid" zu nennen ("serviceid" jetzt mal nur zum test gewählt). Und dann kann man in der UniqueConstraint Annotation genau diesen Spaltennamen verwenden.

--> Problem gelöst.
 

Ähnliche Java Themen


Oben