2011-05-12 148 views
1

我想一到一個在Hibernate映射,是HBM的文件和類如下,Hibernate的一對一的映射問題

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> 

地址的.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; 
} 
} 

我得到followign錯誤:

產生的原因:org.hibernate.InvalidMappingException:無法從資源COM/PSL /學生/ Student.hbm.xml解析映射文檔

由org.xml.sax.SAXParseException引起:必須爲元素類型「one-to-one」聲明屬性「not-null」。

+0

你能告訴我們你的hibernate配置文件(.cfg.xml)嗎? – RAS 2011-05-12 06:35:30

+0

<冬眠構> <會話工廠> <屬性名= 「connection.pool_size」> 1 <屬性名= 「hibernate.dialect」> org.hibernate.dialect.SybaseDialect \t <屬性NAME = 「show_sql」>真 \t \t \t \t <映射資源= 「COM/PSL /學生/ Student.hbm.xml」/> \t \t <映射資源=「COM/PSL /學生/ Address.hbm .xml「/> Uday 2011-05-12 06:51:37

+0

爲什麼你不使用註釋?我覺得它有點直接。 – 2011-05-12 10:41:56

回答

4

一對一的映射,你必須做像以下

<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> 

注意:爲了讓一對一運用獨特=在許多「真實」一個

+0

感謝您的回覆,但這是多對一的呢? 使用多對一,我們可以通過添加「唯一=真」約束。 我想一對一地使用,只是想知道爲什麼我會得到上面提到的錯誤。 – Uday 2011-05-12 07:03:35

0

問題是hibernate-mapping-3.0.dtd沒有聲明一個元素< column>在 < one-to-one>你只能使用使用元素< meta>或<公式> 裏面是可選的,這裏是 所指的這個dtd的段。

<! - 聲明兩個實體(或者從組件, 組件元素等到實體)之間的一對一關聯。 - >

<元件中一比一(元*,*配方)>

< ATTLIST一到一個名CDATA #REQUIRED> < ATTLIST一到一個公式!! CDATA #IMPLIED> <!ATTLIST一到一個接入CDATA #IMPLIED> <!ATTLIST一到一類CDATA #IMPLIED> <!ATTLIST一到一個實體名稱CDATA #IMPLIED> < !ATTLIST一對一級聯CDATA #IMPLIED> <!ATTLIST一對一外連接(true | false | a反對派)#IMPLIED> < ATTLIST一到一個取(加盟|!選擇)#IMPLIED> < ATTLIST一到一個受約束(真!|假) 「假」> < ATTLIST一對一一個外鍵CDATA #IMPLIED> < ATTLIST一到一個屬性,裁判CDATA #IMPLIED> < ATTLIST一到一個懶!(假|代理|無代理)!#IMPLIED> < ATTLIST一對一節點CDATA #IMPLIED> <!ATTLIST一對一嵌入xml(true | false)「true」>

並且對於元素one to one,沒有稱爲not-null的屬性。

+0

檢查你的第一句話。 – 2011-05-12 11:24:22

+0

謝謝你的回覆:) – p27 2011-05-12 12:42:14

0

只需在one-to-one映射中刪除not-null="true"即可。

7

您不能在兩個表上同時使用一對一和一個id生成器。

關係數據庫中的一對一表示主鍵已同步。在這種情況下:一個人和一個具有相同ID的地址將歸在一起。由於學生引用地址,學生主鍵將充當外鍵來解決並需要使用地址主鍵。使用本地生成器生成自己的ID時,這是不可能的。

大多數一對一的關係實際上不應該是一對一的關係。如果您只想在地址上使用外鍵,則只需將其映射爲多對一即可。