# [Hibernate] Zwischentabelle mit mehreren Feldern



## poffi (2. Apr 2007)

Wie bringe ich weitere Felder in die zwischen Tabelle?


```
<set name="attachments" where="OBJ_KEY=2" table="APP_ATT">
<key column="APPLICATION_ID"/>
	<many-to-many column="ATTACHMENT_ID" class="Attachment"/>
</set>
```

Ich hätte gerne eine ID und einen weiteres Feld zur Identifikation des Datensatzes in der generierten Tabelle.

Weitere Frage: Wie lese ich komfortabel alle Attachments einer Applikation aus?

Ideen? Tipps? Tricks?

Danke!


----------



## norman (10. Apr 2007)

wozu brauchst du mehrere felder in der zwischentabelle? es ist ja nur eine zwischentabelle. normal sollte die 2 spalten haben, die zusammen den PK ergeben.

zu zweitens:
	
	
	
	





```
Application app = (Application) mySession.createQuery("from application where ...").uniqueResult();
Set<Attachments> allAttachments = app.getAttachments();
```


----------



## berny76 (20. Dez 2007)

Ich greife den thread einmal auf, da das topic sehr gut passt.

Mal aus der ERM-SIcht:
Wie implementiert man mit hibernate Attribute, die nur einer Beziehungstabelle oder meinetwegen auch "Zwischentabelle" genannt zugeordnet werden können?

Als Beispiel:
Es gibt Tickets und es gibt Kategorien. Beide könne für sich alleine exisitieren.
Ein Ticket kann 0 oder vielen Kategorien zugeordnet sein.
Eine Kategorie kann 0 oder vielen Tickets zugeordnet sein.

Klassische n:m Beziehung und per hibernate durch many-to-many-sets prima als or-mapping modellierbar.

Was ist jetzt aber, wenn auch noch das Erstellungsdatum solch einer Partnerschaft zwischen Ticket und Kategorie festgehalten werden soll? Kann man ja dem Ticket genauso wenig zuordnen wie der Kategorie. Muss also in die Zwischentabelle. Bloß, wie schreiben sich diesbezüglich die hbm.xml-files und wie sehen die Pojos dazu aus?


----------



## Guest (20. Dez 2007)

berny76 hat gesagt.:
			
		

> Was ist jetzt aber, wenn auch noch das Erstellungsdatum solch einer Partnerschaft zwischen Ticket und Kategorie festgehalten werden soll? Kann man ja dem Ticket genauso wenig zuordnen wie der Kategorie. Muss also in die Zwischentabelle. Bloß, wie schreiben sich diesbezüglich die hbm.xml-files und wie sehen die Pojos dazu aus?



was spricht dann gegen 3 pojos und zwei 1:n beziehungen?


----------



## Guest (20. Dez 2007)

Anonymous hat gesagt.:
			
		

> berny76 hat gesagt.:
> 
> 
> 
> ...


Order die Assoziation als ein Embedable mappen.
z.B.
	
	
	
	





```
@Embeddable
public class TicketCategory
{
   @org.hibernate.annotations.Parent
   private Ticket ticket;
   
   @ManyToOne
   @JoinColumn(name="CATEGORY_ID", nullable=false, updatable=false)
   private Category category;
   
   @Temporal(TemporalType.TIMESTAMP)
   @GeneratedValue
   @Column(name = "CATEGORIZED_ON", nullable = false, updatable = false)
   private Date categorizedOn;

   ... usw. 
}   

@Entity
public class Ticket
{
   @Id
   @GeneratedValue
   @Column(name = "TICKET_ID", updatable = false)
   private Long id;
   
   @org.hibernate.annotations.CollectionOfElements
   @JoinTable(
      name = "TICKET_CATEGORY",
      joinColumns = @JoinColumn(name = "TICKET_ID")
   )
   private Set<TicketCategory> categories = new HashSet<TicketCategory>();

   ... usw.
}
```


----------



## berny76 (21. Dez 2007)

Die erste Antwort überzeugt mich noch nicht so ganz. Sieht für mich zu sehr nach workaround aus. Vielleicht verstehe ich es auch bloß nicht.

Zur Zweiten: Dazu habe ich zwei Fragen:
1. Wie kommt man dann in Java an das Datum heran?
2. Zu den Anotations: Sehe ich das richtig, dass wenn man die Pojos so mit Anotations versieht, man keine mapping files (Ticket.hbm.xml...) mehr benötigt?


----------



## Guest (21. Dez 2007)

berny76 hat gesagt.:
			
		

> 1. Wie kommt man dann in Java an das Datum heran?


Einfach über einen Getter in der Klasse TicketCategory.


			
				berny76 hat gesagt.:
			
		

> 2. Zu den Anotations: Sehe ich das richtig, dass wenn man die Pojos so mit Anotations versieht, man keine mapping files (Ticket.hbm.xml...) mehr benötigt?


So ist es. Die werden bei JPA auch gar nicht benötigt, können aber generiert werden, falls man daran Spaß hat.  :roll:  :wink: 

In der persistence.xml brauchst du nur das Scannen aller Klassen einzustellen (passiert einmalig beim Deployment).
	
	
	
	





```
<persistence-unit name="TicketReservationPU">
   <provider>org.hibernate.ejb.HibernatePersistence</provider>
   <properties>
      <property name="hibernate.archive.autodetection" value="class" />
      ...
   </properties>
</persistence-unit>
```


----------



## berny76 (21. Dez 2007)

Gut. das dürfte fürs Erste reichen. Danke Gast


----------

