2014-10-10 9 views
11

Sto creando database utilizzando le classi JPA.come impostare il nome ForeignKey quando ho @ManyToMany

Se abbiamo ManyToOne relazione, possiamo ignorare ForeignKey nome nome come questo:

@ManyToOne 
@JoinColumn(foreignKey = @ForeignKey(name = "FK_COUNTRY")) 
private Country country; 

Nel DB, avremo un risultato del genere:

enter image description here

Ok, questo è simpatico. buon risultato!

MA Non riuscirò a impostare i miei nomi FK quando ho @ManyToMany.

Come posso creare questo? Provo qualcosa di simile, ma non funziona:

@ManyToMany(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY) 
@JoinTable(name = "NEW_TABLE", foreignKey = @ForeignKey(name = "FK_TEST")) 

O qualcosa di simile:

@JoinTable(
     name="NEW_TABLE", 
     joinColumns= 
      @JoinColumn(name="ID1", referencedColumnName="ID", foreignKey = @ForeignKey(name = "FK_DEV_ID")), 
     inverseJoinColumns=ID2", referencedColumnName="ID", foreignKey = @ForeignKey(name = "FK_DEV_ZONE")) 
    ) 

O questo:

@ManyToMany(cascade = CascadeType.PERSIST) 
@JoinTable(name="NEW_TABLE_2", 
      joinColumns= 
       @JoinColumn(name="ID1", referencedColumnName="ID", 
          foreignKey = @ForeignKey(name = "FK_1") 
       ), 
      inverseJoinColumns= 
       @JoinColumn(name="ID2", referencedColumnName="ID", 
          foreignKey = @ForeignKey(name = "FK_2") 
       ), 

      foreignKey = @ForeignKey(name = "FK_1"), 
      inverseForeignKey = @ForeignKey(name = "FK_2") 
    ) 

private List<MyObject> deviceZones; 

Essi non funziona.

Io uso questa versione di vasi:

<dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-entitymanager</artifactId> 
    <version>4.3.6.Final</version> 
</dependency> 

<dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-core</artifactId> 
    <version>4.3.6.Final</version> 
</dependency> 

<dependency> 
    <groupId>org.hibernate.common</groupId> 
    <artifactId>hibernate-commons-annotations</artifactId> 
    <version>4.0.5.Final</version> 
</dependency> 


<dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-validator</artifactId> 
    <version>5.1.2.Final</version> 
</dependency> 

<dependency> 
    <groupId>org.springframework</groupId> 
    <artifactId>spring-jdbc</artifactId> 
    <version>4.0.6.RELEASE</version> 
</dependency> 

e la mia versione Java 1.8

+0

hai provato ad aggiungere anche l'attributo inverseForeignKey? – Giovanni

+0

@Giovanni Sì, ho aggiornato la mia domanda. Ho scritto questo (se è vero) nella mia domanda. – grep

+1

Quale versione di Hibernate stai usando? Ricordo di aver visto alcuni bug in quest'area: https://hibernate.atlassian.net/browse/HHH-8783 per esempio. La versione –

risposta

0

Il problema era causato da un errore di ibernazione. Stavo testando su ibernazione 4.3.X. Soluzione: aggiornare la versione di ibernazione. Il problema è stato risolto nelle versioni più recenti

0

Credo di avere alcuni conflitti vaso lì. Suggerisco di fare questo:

  1. rimuovere i seguenti vasi: Sospensione-commons-annotazioni e hibernate-EntityManager
  2. poi cercare here come si può cambiare il nome della chiave esterna
0

Keep it simple, se è possibile modificare la struttura di DB è sarà più facile per generare un solo straniero chiave

@OneToOne() 
@JoinColumn(name="vehicle_id", referencedColumnName="vehicleId") 
@ForeignKey(name="Fk_userdetails_vehicle") 
public Vehicle getVehicle() { 
    return vehicle; 
} 
Problemi correlati