Mit Spring Boot Starter versuche ich ein einfaches Beispielprojekt zu erstellen, das einen Benutzer mit mehreren enthält Adressfelder. Ich experimentiere mit @DiscriminatorColumn und @DiscriminatorValue, um die verschiedenen Arten von Adressen zu unterscheiden, die ein Benutzer haben kann. HierERROR Tabelle mit diesem Namen [Benutzer_Adresse] ist bereits Entität zugeordnet, wenn dieselbe Join-Tabelle verwendet wird, um auf Unterklassen einer verknüpften Entität zu verweisen
ist eine gekürzte Auswahl der Tabellen in meinem Projekt:
CREATE TABLE user (id INT AUTO_INCREMENT);
CREATE TABLE user_address (user_id INT, address_id INT);
CREATE TABLE address (id INT AUTO_INCREMENT, TYPE VARCHAR(31));
Und hier sind die Klassen Ich versuche zu verbinden:
@Entity
@DiscriminatorColumn(name = "type")
public class Address {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
private String type;
}
@Entity
@DiscriminatorValue("HOME")
public class HomeAddress extends Address {}
@Entity
@DiscriminatorValue("CURRENT")
public class CurrentAddress extends Address{}
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
private String type;
@OneToOne
@JoinTable(
name = "user_address",
joinColumns = {@JoinColumn(name = "user_id", referencedColumnName = "id")},
inverseJoinColumns = {@JoinColumn(name = "address_id", referencedColumnName = "id")}
)
private HomeAddress homeAddress;
@OneToOne
@JoinTable(
name = "user_address",
joinColumns = {@JoinColumn(name = "user_id", referencedColumnName = "id")},
inverseJoinColumns = {@JoinColumn(name = "address_id", referencedColumnName = "id")}
)
private CurrentAddress currentAddress;
}
Ich habe versucht, @OneToOne
mit @OneToMany
ersetzt aber trotzdem funktioniert es nicht.
Der Grund, warum ich dies tun möchte, ist, dass ich daran denke, eine Adresse mit anderen Entitäten zu verbinden. Zum Beispiel Shipping für einen Auftrag oder LocationAddress für ein Gebäude usw.
Hier ist ein Dump des Fehlers:
Caused by: org.hibernate.boot.spi.InFlightMetadataCollector$DuplicateSecondaryTableException: Table with that name [user_address] already associated with entity
at org.hibernate.boot.internal.InFlightMetadataCollectorImpl$EntityTableXrefImpl.addSecondaryTable(InFlightMetadataCollectorImpl.java:1420) ~[hibernate-core-5.0.9.Final.jar:5.0.9.Final]
at org.hibernate.cfg.annotations.EntityBinder.addJoin(EntityBinder.java:972) ~[hibernate-core-5.0.9.Final.jar:5.0.9.Final]
at org.hibernate.cfg.annotations.EntityBinder.addJoin(EntityBinder.java:868) ~[hibernate-core-5.0.9.Final.jar:5.0.9.Final]
at org.hibernate.cfg.ClassPropertyHolder.addJoin(ClassPropertyHolder.java:207) ~[hibernate-core-5.0.9.Final.jar:5.0.9.Final]
at org.hibernate.cfg.AnnotationBinder.processElementAnnotations(AnnotationBinder.java:1792) ~[hibernate-core-5.0.9.Final.jar:5.0.9.Final]
at org.hibernate.cfg.AnnotationBinder.processIdPropertiesIfNotAlready(AnnotationBinder.java:904) ~[hibernate-core-5.0.9.Final.jar:5.0.9.Final]
at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:731) ~[hibernate-core-5.0.9.Final.jar:5.0.9.Final]
at org.hibernate.boot.model.source.internal.annotations.AnnotationMetadataSourceProcessorImpl.processEntityHierarchies(AnnotationMetadataSourceProcessorImpl.java:245) ~[hibernate-core-5.0.9.Final.jar:5.0.9.Final]
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess$1.processEntityHierarchies(MetadataBuildingProcess.java:222) ~[hibernate-core-5.0.9.Final.jar:5.0.9.Final]
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:265) ~[hibernate-core-5.0.9.Final.jar:5.0.9.Final]
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:847) ~[hibernate-entitymanager-5.0.9.Final.jar:5.0.9.Final]
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:874) ~[hibernate-entitymanager-5.0.9.Final.jar:5.0.9.Final]
at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:60) ~[spring-orm-4.3.2.RELEASE.jar:4.3.2.RELEASE]
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:338) ~[spring-orm-4.3.2.RELEASE.jar:4.3.2.RELEASE]
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:373) ~[spring-orm-4.3.2.RELEASE.jar:4.3.2.RELEASE]
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:362) ~[spring-orm-4.3.2.RELEASE.jar:4.3.2.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1637) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1574) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE]
... 16 common frames omitted
Konzeptionell entspricht eine Lieferadresse einer Heimadresse und einer Rechnungsadresse. Warum brauchen Sie unterschiedliche konkrete Implementierungen? – christopher
Sie sollten das Fehlerprotokoll in Ihre Frage einfügen, da es möglicherweise in der Zeit mit externen Hosts verschwindet. – davidxxx
Gemeinsame Beziehungen sind nicht Teil der JPA-Spezifikation. Ihre Verwendung ist nicht portabel und JPA-Provider-spezifisch. FWIW –