Отображение двух классов в одну строку таблицы в гибернации

Можно ли сопоставить два класса в одну строку в таблице в Hibernate

У меня два класса:

public class Student implements java.io.Serializable {
private int studentId;
private String studentName;

public Student() {
}
public int getStudentId() {
    return this.studentId;
}

public void setStudentId(int studentId) {
    this.studentId = studentId;
}

public String getStudentName() {
    return this.studentName;
}

public void setStudentName(String studentName) {
    this.studentName = studentName;
}
}

а также :

public class Address implements java.io.Serializable {

private String street;
private String city;

public Address() {
}

public String getStreet() {
    return street;
}

public void setStreet(String street) {
    this.street = street;
}

public String getCity() {
    return city;
}

public void setCity(String city) {
    this.city = city;
}

Я хочу создать таблицу:

CREATE TABLE  "STUDENT" 
("STUDENTID" NUMBER(10,0) PRIMARY KEY, 
"STUDENTNAME" VARCHAR2(250), 
"STREET" VARCHAR2(250), 
"CITY" VARCHAR2(250)
)

и сопоставьте STUDENTID и STUDENTNAME из класса STUDENT и STREET и CITY из класса ADDRESS.

В настоящее время я сделал следующие сопоставления:

<hibernate-mapping>
<class name="com.vaannila.student.Address" table="STUDENT">
<id>
<generator class="assigned"/>
</id>
<property name="street" column="SREET" type="string" length="250"/>
<property name="city" column="CITY" type="string" length="250"/>
</class>
</hibernate-mapping>

а также :

<hibernate-mapping>
<class name="com.vaannila.student.Student" table="STUDENT">
<id name="studentId" column="STUDENTID" type="int"/>
<property name="studentName" column="STUDENTNAME" type="string" length="250"/>
</class>
</hibernate-mapping>

Я получаю сообщение об ошибке:

Caused by: org.hibernate.InvalidMappingException: Could not parse mapping document from resource com/vaannila/student/Address.hbm.xml
Caused by: org.hibernate.MappingException: must specify an identifier type: com.vaannila.student.Address

Пожалуйста помоги


person vishnu viswanath    schedule 10.01.2012    source источник
comment
спящий режим попробуйте с аннотациями, это намного проще, чем это ...   -  person Kushan    schedule 10.01.2012
comment
аннотации более тесно связаны, не так ли? Вот почему я подумал об использовании файлов mapping.xml. Поправьте меня, если я ошибаюсь   -  person vishnu viswanath    schedule 10.01.2012
comment
@ user864624: да, конфигурация в xml делает приложение гибернации менее связанным по сравнению с конфигурацией в виде аннотаций. Например, изменить имя столбца проще в xml, чем в java-файле в качестве аннотации. Чтобы внести изменения, файл java необходимо перекомпилировать.   -  person Gaurav    schedule 10.01.2012
comment
Но время разработки намного выше аннотаций. А кодирование аннотаций стало проще и все в одном месте.   -  person Kushan    schedule 10.01.2012


Ответы (3)


Это плохой дизайн как с точки зрения объекта Java, так и с точки зрения сущности базы данных. Посмотрите на свой файл конфигурации адреса - я думаю, вы увидите, где он разваливается, о чем свидетельствует ваша попытка определить поле id. Всегда старайтесь помнить о том, что вы пытаетесь моделировать, в данном случае это Студенты и Адреса. Если эти две сущности всегда будут взаимно однозначными, продолжайте и объединяйте классы Address и Student (вместо того, чтобы пытаться разделить их).

Конечно, я думаю, вы обнаружите, что отношения действительно много-к-одному. И если мы говорим здесь о колледже, чем о очень-многих-к-одному. Примеры на Vaanila так структурированы неспроста, я рекомендую изучить их подробно:

http://www.vaannila.com/hibernate/hibernate-example/hibernate-mapping-many-to-one-1.html

person Perception    schedule 10.01.2012
comment
Я объясню реальный сценарий, с которым я столкнулся. Я нажимаю на службу, которая даст ответ xml, который сопоставлен с объектом jaxb. В этом xml есть несколько сокращений вверху и соответствующее расширение в наборе тегов внизу. Я хотел бы поместить abbrv в таблицу вместе с расширением в строке. Поэтому мне нужно сопоставить два объекта в одной строке. - person vishnu viswanath; 10.01.2012
comment
@sonic - У вас есть контроль над веб-сервисом и кодом базы данных? Я бы рекомендовал иметь по одному набору объектов модели для каждого взаимодействия с JAXB и БД. Вы можете отобразить несколько объектов JAXB на один объект БД. - person Perception; 10.01.2012
comment
Я не контролирую то, что возвращается в сервисе. Я контролирую код БД. Я решил выбрать объект-значение. сопоставьте jaxb с VO и поместите его в БД, используя спящий режим. - person vishnu viswanath; 10.01.2012

У вас должно получиться это довольно легко. Вот как использовать аннотации из другого вопроса:

Наследование одной таблицы БЕЗ столбца дискриминатора

При желании вам придется самостоятельно вычислить перевод в XML!

person JoeG    schedule 25.07.2012

да, возможно, вы можете использовать тег component в xml.

person vishal saini    schedule 15.09.2016