Xml Hibernate一对一映射问题

Xml Hibernate一对一映射问题,xml,hibernate,Xml,Hibernate,我正在hibernate中尝试一对一的映射,hbm文件和类如下所示 Student.hbm.xml: <hibernate-mapping> <class name="com.psl.student.Student" table="STUDENT"> <meta attribute="class-description">This class contains student details.</meta>

我正在hibernate中尝试一对一的映射,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>
<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>
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:必须为元素类型一对一声明属性NOTNULL。

对于一对一映射,必须执行以下操作


注意:要使一对一映射在多对一映射中使用unique=true,您必须执行以下操作


注意:要使多对一中的一对一use unique=true,问题在于hibernate-mapping-3.0。dtd不会在 只能使用元素 其中可选的是dtd的段 指的是这个

<!-声明两个实体之间或组件之间的一对一关联, 实体的组件元素等。->

<!元素一对一元*,公式*>

<!ATTLIST一对一姓名CDATA必填项> < !ATTLIST一对一公式CDATA隐含> < !ATTLIST一对一访问隐含CDATA> < !ATTLIST一对一类隐含CDATA> < !ATTLIST一对一实体名称CDATA隐含> < !ATTLIST一对一级联CDATA隐含> < !ATTLIST一对一外部联接true | false |自动隐含> < !ATTLIST一对一获取连接|选择隐含> < !ATTLIST一对一约束真|假假> < !ATTLIST一对一外键CDATA隐含> < !ATTLIST一对一属性参考CDATA隐含> < !ATTLIST一对一懒惰错误|代理|未暗示代理> < !ATTLIST一对一节点隐含CDATA> < !ATTLIST一对一嵌入xml true | false true>


对于元素一对一,没有名为NOTNULL的属性。

问题在于hibernate-mapping-3.0。dtd没有在 只能使用元素 其中可选的是dtd的段 指的是这个

<!-声明两个实体之间或组件之间的一对一关联, 实体的组件元素等。->

<!元素一对一元*,公式*>

<!ATTLIST一对一姓名CDATA必填项> < !ATTLIST一对一公式CDATA隐含> < !ATTLIST一对一访问隐含CDATA> < !ATTLIST一对一类隐含CDATA> < !ATTLIST一对一实体名称CDATA隐含> < !ATTLIST一对一级联CDATA隐含> < !ATTLIST一对一外部联接true | false |自动隐含> < !ATTLIST一对一获取连接|选择隐含> < !ATTLIST一对一约束真|假假> < !ATTLIST一对一外键CDATA隐含> < !ATTLIST一对一属性参考CDATA隐含> < !ATTLIST一对一懒惰错误|代理|未暗示代理> < !ATTLIST一对一节点隐含CDATA> < !ATTLIST一对一嵌入xml true | false true>


对于元素一对一,没有名为NOTNULL的属性。

在一对一映射中只需删除NOTNULL=true。

在一对一映射中只需删除NOTNULL=true。

不能同时在两个表上使用一对一和id生成器

关系数据库中的一对一意味着主键得到同步。在这种情况下:具有相同id的人和地址将属于一起。因为学生引用地址,所以学生主键将充当地址的外键,并且需要使用地址主键。当它使用本机生成器生成自己的id时,这是不可能的


大多数一对一的关系实际上不应该是一对一的。如果您只想将外键映射到地址,请将其简单地映射为一。

不能同时在两个表上使用一对一和id生成器

关系数据库中的一对一意味着主键得到同步。在这种情况下:具有相同id的人和地址将属于一起。因为学生引用地址,所以学生主键将充当地址的外键,并且需要使用地址主键。当它使用本机生成器生成自己的id时,这是不可能的


大多数一对一的关系实际上不应该是一对一的。如果您只想将一个外键映射到地址,请将其简单地映射为一个。

能否显示您的hibernate配置文件.cfg.xml?1 org.hibernate.dialogue.sybasedialogue true为什么不使用注释?我觉得有点简单。你能给我们看看你的hibernate配置文件.cfg.xml吗?1 org.hibernate.dialogue.sybasedialogue true为什么不使用注释?我觉得有点奇怪
向前看。谢谢你的回复,但这是多对一,是吗?使用多对一,我们可以添加unique=true约束。我想使用一对一,只是想知道为什么我会出现上述错误。谢谢你的回复,但这是多对一,是吗?使用多对一,我们可以添加unique=true约束。我想使用一对一,只是想知道为什么我会出现上述错误。。
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;
}
}
<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>