Hibernate один в один проблема сопоставления - PullRequest
1 голос
/ 12 мая 2011

Я пробую сопоставление один-к-одному в спящем режиме. Файлы hbm и классы выглядят следующим образом:

Student.hbm.xml:

<hibernate-mapping>
    <class name="com.psl.student.Student" table="STUDENT">
        <meta attribute="class-description">This class contains student details.</meta>
        <id name="studentId" type="long" column="STUDENT_ID">
            <generator class="native" />
        </id>
        <property name="studentName" type="string" length="100"  column="STUDENT_NAME" />
        <one-to-one name="studentAddress" class="com.psl.student.Address" not-null="true" column ="STUDENT_ADDRESS"  />
    </class>
</hibernate-mapping>

Address.hbm.xml:

<hibernate-mapping>
    <class name="com.psl.student.Address" table="ADDRESS">

    <meta attribute="class-description">This class contains the student's address details.</meta>
    <id name="addressId" type="long" column="ADDRESS_ID">
        <generator class="native" />
    </id>

    <property name="street" column="ADDRESS_STREET" type="string" length="250" />
    <property name="city" column="ADDRESS_CITY" type="string" length="50" />
    <property name="state" column="ADDRESS_STATE" type="string" length="50" />
    <property name="zipcode" column="ADDRESS_ZIPCODE" type="string" length="10" />
</class>

</hibernate-mapping>

Student.java:

public class Student implements java.io.Serializable {
private long studentId;
private String studentName;
private Address studentAddress;     

public Student() {
}

public Student(String studentName, Address studentAddress) {
    this.studentName = studentName;
    this.studentAddress = studentAddress;
}

public long getStudentId() {
    return this.studentId;
}

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

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

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

public Address getStudentAddress() {
    return this.studentAddress;
}

public void setStudentAddress(Address studentAddress) {
    this.studentAddress = studentAddress;
}
}

Address.java:

public class Address implements java.io.Serializable {

private long addressId;
private String street;
private String city;
private String state;
private String zipcode;

public Address() {
}

public Address(String street, String city, String state, String zipcode) {
    this.street = street;
    this.city = city;
    this.state = state;
    this.zipcode = zipcode;
}

public long getAddressId() {
    return this.addressId;
}

public void setAddressId(long addressId) {
    this.addressId = addressId;
}

public String getStreet() {
    return this.street;
}

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

public String getCity() {
    return this.city;
}

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

public String getState() {
    return this.state;
}

public void setState(String state) {
    this.state = state;
}

public String getZipcode() {
    return this.zipcode;
}

public void setZipcode(String zipcode) {
    this.zipcode = zipcode;
}
}

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

Причина: org.hibernate.InvalidMappingException: Не удалось проанализировать документ сопоставления из ресурса com / psl / student / Student.hbm.xml

Причина: org.xml.sax.SAXParseException: Атрибут «not-null» должен быть объявлен для типа элемента «один-к-одному».

Ответы [ 4 ]

7 голосов
/ 13 мая 2011

Нельзя использовать один-к-одному и генератор идентификаторов в обеих таблицах одновременно.

один-к-одному в реляционной базе данных означает, что первичные ключи синхронизируются.В этом случае: человек и адрес с одинаковым идентификатором будут принадлежать друг другу.Поскольку учащийся ссылается на адрес, первичный ключ учащегося будет действовать как внешний ключ для адреса, и ему необходимо использовать первичный ключ адресов.Это невозможно, когда он генерирует свой собственный идентификатор с помощью собственного генератора.

Большинство отношений один к одному на самом деле не должны быть отношения один к одному.Если вы просто хотите иметь внешний ключ к адресу, сопоставьте его просто как многие-к-одному.

4 голосов
/ 12 мая 2011

для однозначного сопоставления вы должны сделать следующее

<class name="dto.StudentDto" table="STUDENTDTO">
    <id name="studentId" type="long">
        <column name="STUDENTID" />
        <generator class="assigned" />
    </id>
    <property name="serialVersionUID" type="long" access="field">
        <column name="SERIALVERSIONUID" />
    </property>
    <property name="studentName" type="java.lang.String">
        <column name="STUDENTNAME" />
    </property>
    <many-to-one name="studentAddress" class="dto.Address" not-null="true" cascade="all" unique="true">
        <column name="STUDENTADDRESS" />
    </many-to-one>
</class>

примечание: для однозначного использования уникально = "true" во многих к одному

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

Просто удалите not-null="true" в сопоставлении one-to-one.

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

Проблема в том, что hibernate-mapping-3.0.dtd не объявляет элемент под <один-к-одному> вы можете использовать только использовать элементы <мета> или <формула> внутри которого необязательно, здесь находится сегмент dtd, который относится к этому.

<! - Объявляет взаимно-однозначную связь между двумя объектами (или из компонента, компонент элемента и т. д. для объекта). ->

<! ELEMENT один в один (мета *, формула *)>

<! ATTLIST однозначное имя CDATA # ТРЕБУЕТСЯ> <! ATTLIST формула один-к-одному CDATA # ПРЕДПОЛАГАЕТСЯ> <! ATTLIST один-к-одному доступ CDATA # ПРЕДПОЛАГАЕТСЯ> <! ATTLIST один-к-одному классу CDATA # ПРЕДПОЛАГАЕТСЯ> <! ATTLIST однозначное имя объекта CDATA # ПРЕДПОЛАГАЕТСЯ> <! ATTLIST каскад один-к-одному CDATA # IMPLIED> <! ATTLIST внешнее соединение один-к-одному (true | false | auto) # ПРЕДПОЛАГАЕТСЯ> <! ATTLIST выборка один на один (join | select) # ПРЕДПОЛАГАЕТСЯ> <! ATTLIST один-к-одному ограничен (true | false) "false"> <! ATTLIST один-к-одному с внешним ключом CDATA # ПРЕДПОЛАГАЕТСЯ> <! ATTLIST свойство "один к одному", ссылка на CDATA # ПРЕДПОЛАГАЕТСЯ> <! ATTLIST один-к-одному ленивый (false | proxy | no-proxy) # ПРЕДПОЛАГАЕТСЯ> <! ATTLIST один-к-одному узлу CDATA # ПРЕДПОЛАГАЕТСЯ> <! ATTLIST один-к-одному embed-xml (true | false) "true">

и для элемента один в один нет атрибута с именем not-null.

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