HIbernate的实体自关联如何写配置文件
例如,我们写一个类来描述生活中的接口,架设写的是RJ45接口,因为RJ45接口只能与RJ45接口连接,所以在RJ45接口类里面有一个linker是RJ45类型的,那么在这...
例如,我们写一个类来描述生活中的接口,架设写的是RJ45接口,因为RJ45接口只能与RJ45接口连接,所以在RJ45接口类里面有一个linker是RJ45类型的,那么在这种情况下怎么写关联呢?已知写成<one-to-one name="linker" />的话是不行的。求大牛指导、、、
展开
展开全部
单项的配置many-to-one吧,如果是一对一,还要在里面写unique="true",本来是多对一,但是加上unique="true",就表示唯一,那就是一对一了。
如果是双向关联,则要在另外一边配置one-to-one,property_ref="linker",property_ref=""相当于mappedBy,就是指定由哪一方来维护双方的关系。
写配置文件累死了,而且时不时有一些错误,直接用Annotation方便得多,其实hibernate帮助文档上提供了很多例子,要学会穿一手鞋,主动学习放弃被动灌输。
以下是1对1的关系配置
一对一:(少用,可以合成一张表,数据库表一般设计成单向外键关联或主键关联)
外键关联:
单向:@OneToOne @JoinColumn指定外键列名 <many-to-one unique="true"/>
双向:@OneToOne(MappedBy,意思是由哪边维护关联关系,相当与xml中的inverse)
<many-to-one unique="true"/> <one-to-one property_ref=""/>(property_ref相当于MappedBy) 两个都用<many-to-one/>也会生成两个外键
注意:
1、对于双向关联除了双向主键关联,annotation必须加MappedBy(否则会产生冗余外键)
2、设置MappedBy还可以在添加的时候由对方设置关联不再需要两边都设置
如果是双向关联,则要在另外一边配置one-to-one,property_ref="linker",property_ref=""相当于mappedBy,就是指定由哪一方来维护双方的关系。
写配置文件累死了,而且时不时有一些错误,直接用Annotation方便得多,其实hibernate帮助文档上提供了很多例子,要学会穿一手鞋,主动学习放弃被动灌输。
以下是1对1的关系配置
一对一:(少用,可以合成一张表,数据库表一般设计成单向外键关联或主键关联)
外键关联:
单向:@OneToOne @JoinColumn指定外键列名 <many-to-one unique="true"/>
双向:@OneToOne(MappedBy,意思是由哪边维护关联关系,相当与xml中的inverse)
<many-to-one unique="true"/> <one-to-one property_ref=""/>(property_ref相当于MappedBy) 两个都用<many-to-one/>也会生成两个外键
注意:
1、对于双向关联除了双向主键关联,annotation必须加MappedBy(否则会产生冗余外键)
2、设置MappedBy还可以在添加的时候由对方设置关联不再需要两边都设置
追问
这些对自关联都是不起作用的,因为自关联它关联的本来就是自身的实体,在写关联关系时,它只能写一个而已。
追答
那你把一张表看做两张表,一个对象看做两个对象不就行了么
比如Oracle数据库中的scott用户下有一张emp表,其中有两个列:empno和mgr是一模一样的,empno是员工编号,mgr是上司的员工编号,而上司也属于一个员工,所以mgr这个列中的数据都是引用empno这个列的。
写java实体类的时候,你只要在该类中加入一个自己的引用,用来表示上司,不就行了?如果还要找出你的下属,那就加一个Set集合,集合中的对象就是自己。
@Entity
public class Emp{
@Id
private int empno;
private String ename;
//下属和上司存在1对多的关系,也就是1个上司有多个下属,所以是ManyToOne
@ManyToOne
private Emp mgr; //这就是引用自己
//双向关联时,只要加上OneToMany就行了,关系肯定是由多的一方维护,所以加mappedBy
@OneToMany(mappedBy="mgr")
private Set xiashu; //这就是你的下属
}
这样就是自联1对多,自联1对1还不就是一样的。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询