Проблема аннотации @SecondaryTable - PullRequest
2 голосов
/ 29 октября 2009

У меня есть следующая модель,


@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;
...
}

Когда я пытаюсь вставить подкласс User, я получаю сообщение об ошибке, показанное ниже

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

Пожалуйста, пролите немного света на это поведение.

Определения классов: -

Класс ManagedObject



@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;
...
}

Класс участника



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

}

Один из классов данных / информации, например UserPersonalDetails



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

Обновление:

Добавлена ​​аннотация @Column(table="") в членах UserPersonalDetails, и да, у меня есть аннотация @Embedded в классе User. Я столкнулся со следующим исключением:


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

Ответы [ 2 ]

1 голос
/ 30 марта 2011

удалите все @Column в полях и укажите @Column для методов. Также укажите @table(Column="SecondaryTableName") только для полей имен вторичных таблиц. Эта реализация решила мою проблему.

0 голосов
/ 29 октября 2009

Вы неправильно сопоставили другие классы (например, UserPersonalDetails).

Они либо должны отображаться как @ Embedded , либо как истинные @ ManyToOne (или, возможно, @OneToOne) связей.

В настоящий момент вы пытаетесь сопоставить весь класс (UserPersonalDetails) с одиночным столбцом (personalInfo, поскольку вы не указали имя явно) в объединенной таблице (user_personal_details), которая не будет работать.

Обновление (на основе сопоставлений, опубликованных на вопрос)

Вы не обновили свой класс User, я предполагаю, что вы заменили объявления @Column на @Embedded. По сути, вам нужно:

// 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;
  ...
}

Как видите, вам нужно объявить таблицу, в которую будут сопоставлены столбцы вашего компонента, потому что по умолчанию все они идут в "основную" таблицу (например, в ту, в которую отображается ваша сущность). Это можно НЕ сделать с помощью аннотации @Table для встраиваемых объектов - вам нужно сделать это с помощью @Column, как показано выше, или с помощью @AttributeOverrides, но последний вариант сложнее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...