Hibernate Mapping Дополнительное значение - PullRequest
3 голосов
/ 19 мая 2011

У меня есть два класса, которые должны отображаться в формате XML (в конечном итоге все они будут изменены на Аннотации, но в настоящее время нам необходимо поддерживать сопоставления XML).

У меня есть объект User, который в настоящее время выглядит следующим образом:

public class User {
    private Key key;
    private Name name;
}

Мне нужно добавить в Настройки для некоторых этих пользователей (у нас есть два разных типа пользователей, которые совместно используют один и тот же объект).

public class Preferences {
   private Person person; //The person key acts as our foreign and primary key
   private Integer numToShow;
   private String defaultScreenToShow;
}

Мой личный XML таков:

<hibernate-mapping package="com.example.entities">
    <id key column="PERSON_ID" /> <!-- Leaving out custom generator -->

     <!-- 
         Not sure what the column needs to be here, as 
         preferences are in own table.  Also read it has to 
         be a faked out many-to-one here as not all users will
         have preferences. 
     -->
    <many-to-one name="preferences" not-null="false" /> 
    <component class="com.example.entities.Name">
        <property column="first_name" name="first" />
        <property column="last_name" name="last" />
    </component>

</hibernate-mapping>

XML-файл моих настроек таков:

<hibernate-mapping package="com.example.entities">
    <property column="default_screen" name="defaultScreenToShow" />
    <property column="number_search_results" name="numToShow" />
    <!-- Not sure what the ID needs to be here -->
</hibernate-mapping>

Я довольно зеленый с Hibernate, если честно, но это кажется чем-то, что должно быть довольно легко отобразить. Я думал, что у меня все отображения сделаны правильно, но я получаю исключение десериализации при попытке загрузить человека ( Я пометил классы как Сериализуемые - безрезультатно).

Ответы [ 3 ]

1 голос
/ 08 июня 2011

Я смог решить это по своему усмотрению (Аннотирование нового класса и добавление в XML старого класса. Когда я использовал XML в каждой ситуации, я мог сохранять только порядковое значение перечисления, чего не хотелось).

Person.hbm.xml
<join table="PREFS_JOIN_TABLE" optional="true">
    <key column="PERSON_ID" />
    <many-to-one name="preferences" column="PREFERENCES_ID" not-null="true" unique="true" cascade="all"/>
</join>

Мой новый класс, который я смог аннотировать, теперь выглядит так:

@Entity
@Table(name = "PREFERENCES")
public class UserPreferences implements Preferences {
    private Long id;
    private Panel defaultPanelToShow;
    private Person person;

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator="prefSeq")
    @SequenceGenerator(name="prefSeq", sequenceName = "SQ_PREFERENCES_ID", allocationSize = 10, initialValue = 1)
    @Column(name="PREFERENCES_ID")
    public Long getId() {
        return id;
    }

    @Column(name="DEFAULT_USER_PANEL")
    @Enumerated(EnumType.STRING)
    public Panel getDefaultRequestPanel() {
        return defaultPanelToShow;
    }

    @OneToOne
    @JoinTable(name="PREFS_JOIN_TABLE", joinColumns=@JoinColumn(name="PREFERENCES_ID", unique=true), inverseJoinColumns=@JoinColumn(name="PERSON_ID", unique=true))
    public Person getPerson() {
        return person;
    }
}
0 голосов
/ 19 мая 2011

Попробуйте сопоставить его как составной идентификатор только с одним компонентом.

Что-то вроде:

<composite-id name="col_name">
   <key-many-to-one name="person" class="Person" column="person_col"/>
</composite-id>

В противном случае вы можете просто установить его значение как уникальное и использовать встроенный сгенерированный ключ hibernate, при этом все еще имея возможность искать одну строку на основе Person,

0 голосов
/ 19 мая 2011

Взгляните на главу Сопоставления ассоциаций справочной документации Hibernate, так как в ней объясняется несколько различных способов сопоставления всех видов ассоциаций в зависимости от того, является ли связь однонаправленной или двунаправленной, однозначной. один, один-ко-многим или многие-ко-многим, а также является ли связь между таблицами прямой или осуществляется через таблицу соединений.

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