2 Stimmen

@SecondaryTable-Anmerkungsproblem

Ich habe folgendes Modell,

@Entity
@Table(name = "user")
@PrimaryKeyJoinColumn(name="user_id")
@SecondaryTables({
@SecondaryTable(name = "user_personal_details", pkJoinColumns = {@PrimaryKeyJoinColumn(name = "user_id", referencedColumnName = "user_id")}),
@SecondaryTable(name = "user_address", pkJoinColumns = {@PrimaryKeyJoinColumn(name = "user_id", referencedColumnName = "user_id")}),
@SecondaryTable(name = "user_contact_info", pkJoinColumns = {@PrimaryKeyJoinColumn(name = "user_id", referencedColumnName = "user_id")}),
@SecondaryTable(name = "user_auth_info", pkJoinColumns = {@PrimaryKeyJoinColumn(name = "user_id", referencedColumnName = "user_id")})
})
public abstract class User extends Member implements IUser {
    @Column(table="user_personal_details")
    private UserPersonalDetails personalInfo;
    @Column(table="user_address")
    private Address address;
    @Column(table="user_contact_info")
    private UserContactDetails contactDetails;
    @Column(table="user_auth_info")
    private UserAuthInfo authInfo;
...
}

Wenn ich versuche, eine Unterklasse von User Ich erhalte die unten abgebildete Fehlermeldung

10641 [main] ERROR org.hibernate.AssertionFailure - an assertion failure occured (this may indicate a bug in Hibernate, but is more likely due to unsafe use of the session)
org.hibernate.AssertionFailure:Table user_personal_details not found

Bitte klären Sie mich über dieses Verhalten auf.

Klassendefinitionen:-

ManagedObject-Klasse

@Entity
@Table(name="managed_object")
@Inheritance(strategy=InheritanceType.JOINED)

public abstract class ManagedObject implements IManagedObject
{
    @Id
        @Column(name="mo_id", nullable=false, updatable=false)
        private String id;
    @Column(name="mo_name", nullable=false, updatable=true)
        private String name;
        @Column(name="mo_type", nullable=false, updatable=true)
    private String type;
        @Column(name="mo_additional_info", nullable=true, updatable=true)
    private String additionalInfo;
...
}

Mitglied Klasse

@Entity
@Table(name="t_member")
@PrimaryKeyJoinColumn(name="member_id")
public abstract class Member extends ManagedObject implements IMember {

}

Eine der Daten/Info-Klassen wie UserPersonalDetails

@Embeddable
@Table
public class UserPersonalDetails extends InfoObject{
    private String firstName;
    private String middleName;
    private String lastName;
...
}

Aktualisierung:

Añadido @Column(table="") Anmerkung in UserPersonalDetails-Mitgliedern und ja, ich habe @Embedded Vermerk in User Klasse. Ich bin auf folgende Ausnahme gestoßen:

4469 [main] ERROR org.hibernate.AssertionFailure - an assertion failure occured (this may indicate a bug in Hibernate, but is more likely due to unsafe use of the session)
org.hibernate.AssertionFailure: Table user_personal_details not found

1voto

Saravanakumar Punkte 11

Alle entfernen @Column auf den Feldern und geben @Column für die Methoden. Geben Sie auch die @table(Column="SecondaryTableName") nur für die Felder der sekundären Tabellennamen. Diese Implementierung hat mein Problem gelöst.

0voto

ChssPly76 Punkte 97241

Sie haben keine anderen Klassen zugeordnet (wie UserPersonalDetails ) richtig.

Sie müssen entweder als @Eingebettet oder als wahr @ManyToOne (oder, möglicherweise, @OneToOne ) Assoziationen.

So wie es im Moment aussieht, versucht man, eine gesamte Klasse ( UserPersonalDetails ) zu einer einzelne Spalte ( personalInfo weil Sie den Namen nicht explizit angegeben haben) in der verbundenen Tabelle ( user_personal_details ), was nicht funktionieren wird.

Update (basierend auf den Zuordnungen, die auf die Frage gepostet wurden)

Sie haben Ihre Daten nicht aktualisiert User Klasse, werde ich davon ausgehen, dass Sie die @Column Deklarationen mit @Embedded darin. Im Grunde genommen brauchen Sie Folgendes:

// header annotations are the same as above
public abstract class User extends Member implements IUser {
  @Embedded
  private UserPersonalDetails personalInfo;
  // other components go here
  ...
}

@Embeddable
public class UserPersonalDetails extends InfoObject {
  @Column(table="user_personal_details")
  private String firstName;

  @Column(table="user_personal_details")
  private String middleName;

  @Column(table="user_personal_details")
  private String lastName;
  ...
}

Wie Sie sehen, müssen Sie die Tabelle angeben, auf die die Spalten Ihrer Komponente abgebildet werden sollen, da sie standardmäßig auf die "Haupttabelle" (z.B. die Tabelle, auf die Ihre Entität abgebildet ist) zugreifen. Das kann NICHT erfolgen über @Table Annotation auf embeddable - Sie müssen es über @Column wie oben gezeigt oder über @AttributeOverrides aber letzteres ist unordentlicher.

0 Stimmen

Ich glaube nicht, dass ich mit @ManyToOne/@OneToOne zuordnen kann, da Klassen wie UserPersonalDetails keine Entitäten sind, sondern reine Datenklassen. Ich habe auch versucht, vorgeschlagen @Embedded Annotation hier sind meine Beobachtungen - -I don't encounter any error -Tabellen für Datenklassen dh. Tabellen wie user_personal_details wird immer mit user_id als Primärschlüssel, aber kein Zeichen von anderen Spalten in dieser Tabelle -Tabelle Benutzer hat alle Spalten, die Attribute, die in Datenklassen wie UserPersonalDetails definiert sind entsprechen -Wenn ich den Benutzer Objekt UserPersonalDetails Daten wird in Benutzer-Tabelle Spalten gespeichert speichern

0 Stimmen

Vielleicht sollten Sie sie zu Entitäten machen; es erscheint ziemlich seltsam, die Modellstruktur in mehrere Tabellen aufzuteilen, wenn es keine tatsächlichen Beziehungen gibt. Das ist aber nur meine Meinung - Sie können sie sicherlich stattdessen als eingebettet abbilden. Es ist schwer, Ihre "Beobachtungen" zu kommentieren, ohne Ihr Mapping zu sehen - wenn Sie Ihre Frage aktualisieren können, um Mappings für Ihre Klassen zu zeigen (user + jede verschachtelte sollte ausreichen), werde ich einen Blick darauf werfen. Aus Ihrer Beschreibung geht hervor, dass Sie das Attribut "table" für Ihre verschachtelten Spalten nicht angeben - und das müssen Sie aufgrund Ihrer @SecondaryTable-Mappings auch.

0 Stimmen

Ich möchte eine gewisse Trennung zwischen den Kerninformationen einer Entität und anderen Merkmalen dieser Entität, also versuche ich, die mit dieser Entität verbundenen Informationen weiter aufzubrechen/zu klassifizieren. Mir ist klar, dass dies keine Auswirkung auf das Programmiermodell als solches haben wird. Zurzeit bette ich diese reinen Info-/Datenklassen in die Entitätstabelle ein und mache weiter, ohne stecken zu bleiben, aber ich lerne gerade Hibernate, also möchte ich sicherstellen, dass ich die Hibernate Mapping-Techniken gründlich lerne. Wie auch immer, danke für Ihre Beiträge. P.S.: Bitte sehen Sie sich die aktualisierte Frage an.

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