我写了这两门课:
public class ClasseA {
Integer id;
String numero;
ClasseB cb;
public ClasseB getCb() {
return cb;
}
public void setCb(ClasseB cb) {
this.cb = cb;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getNumero() {
return numero;
}
public void setNumero(String numero) {
this.numero = numero;
}
}
和
public class ClasseB {
Integer id;
String annotazione;
public String getAnnotazione() {
return annotazione;
}
public void setAnnotazione(String annotazione) {
this.annotazione = annotazione;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
}
正如您在ClasseA中看到的,有一个对ClasseB的引用。
这是映射:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class dynamic-insert="false" dynamic-update="false" mutable="true" name="ClasseA" optimistic-lock="version" polymorphism="implicit" select-before-update="false">
<id name="id" type="java.lang.Integer">
<column name="id"/>
<generator class="identity"/>
</id>
<property name="numero" type="java.lang.String">
<column name="numero"/>
</property>
<one-to-one cascade="all" class="ClasseB" name="cb"/>
</class>
<class dynamic-insert="false" dynamic-update="false" mutable="true" name="ClasseB" optimistic-lock="version" polymorphism="implicit" select-before-update="false">
<id name="id" type="java.lang.Integer">
<column name="id"/>
<generator class="identity"/>
</id>
<property name="annotazione" type="java.lang.String">
<column name="annotazione"/>
</property>
</class>
</hibernate-mapping>
有两件事不像预期的那样起作用:
首先,由于我使用的是
创建表classea
( id
INT(11) NOT NULL AUTO_INCREMENT,numero
VARCHAR(255)默认为NULL,
主键(id
) ENGINE=INNODB AUTO_INCREMENT=5默认CHARSET=latin1
创建表CHARSET=latin1
classeb
( id
int(11) NOT NULL AUTO_INCREMENT,annotazione
varchar(255)默认NULL,主键(id
) ) ENGINE=InnoDB AUTO_INCREMENT=5默认值AUTO_INCREMENT,如果我保存cb正确设置为cb istance的classeA语句,它将在第一个表上放置一行,在第二个表上放置一行。但在猎犬身上它甚至不装载classeA..。请帮助我,因为我认为我没有正确地理解这种联系。请不要建议使用注释,因为我不能。Tnx提前。
发布于 2010-02-10 08:55:59
我对一对一的理解是他们有着共同的身份。也就是说,当您创建一个ClasseA时,ClasseA内部的ClasseB将具有相同的id。这两个表之间没有明确的引用。
为了保持理智,我经常使用多对一,甚至在一对一的情况下,因为这会像您所期望的那样在数据库中创建外键列。
如果没有关于用于保存和加载的代码的更多信息,我就不确定您正在遇到的检索问题。
发布于 2010-02-12 13:00:35
我认为问题是B类的id与A类没有正确关联,我假设您是通过主键将这两个类关联起来的。那就试试这个。
首先,对于一对一的关系,两个类都需要配置一对一的映射.
将其添加到类B的定义中(注意:约束属性对于hibernate模式生成工具非常重要):
<one-to-one class="ClasseA" name="ca" constrained="true" />
第二,确保依赖类将其id与类A关联,使用
<generator class="foreign">
https://stackoverflow.com/questions/2238603
复制相似问题