|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
IDE是好。java中的IDE更是百花齐放,你用jbuilder能说jbuilder赶不上vs吗?用eclipse,netbeans也很舒服啊。我就不明白“稍微差一些”那一些是从哪里差来的。 对象和对象之间除承继干系以外,还存在着联系关系干系:包含分作一对1、一对多、多对一和多对多,因为这几种干系在KodoEJB中的完成道理基础相似,因而本文中次要就一对一类联系关系干系举行深切的报告,同时经由过程复杂例子的剖析和理论具体的申明怎样利用KodoEJB中供应的正文来界说类和类之间的联系关系干系,剩下的一对多、多对一和多对多三种干系将只在文章最初举行申明,请读者参考一对一干系的完成历程。
面向对象的天下里,类A和类B之间的一对一干系必需满意以下前提:
- 对象A1援用了对象B1
- 类A其他对象An不成能使用一样的对象B1
在干系数据库中,我们一般利用独一外键的体例来完成一对一干系,上面这个图申明了这类的情形。
上面入手下手先容一下KodoEJB中和一对一干系完成相干的常识,为了申明的必要,我们起首界说一个假造的场景。
摹拟场景
我们假定要完成一个藏书楼办理体系,该体系中必要办理良多书,我们必要纪录书的基础信息如编号、书名、出书日期等基础信息,还必要纪录书的媒介,序等信息。
假定我们依据下面的需求,将书计划成一个类(Book),包含了书的编号和称号两个属性,同时将书的媒介信息计划成别的一个类(BookExtend),它包含了书的编号和媒介信息两个属性。因为一本书有媒介并且也不成能有其他的书媒介部分会和他一样,以是类Book和BookExtend之间很天然的构成了一对一的干系。这两个类的属性和类之间的干系以下图所示。
[注]
1、为了申明的复杂,例子计划时每一个对象仅仅选择了需要的属性。
2、下面的计划仅仅为了演示的请求而特地接纳,不代表计划公道。
KodoEJB中和一对一干系完成相干的内容
在KodoEJB中,我们可使用复杂的OneToOne正文来声明类和类之间的一对一干系,别的可选的,我们可使用JoinColumn正文来声明两个类对应的表之间利用甚么字段来举行联系关系。
OneToOne
OneToOne正文供应了5个属性供开辟者界说类和类之间一对一干系的细节内容。
- targetEntity
Class范例的属性。
界说干系类的范例,默许是该成员属性对应的类范例,以是一般不必要供应界说。
- mappedBy
String范例的属性。
界说类之间的双向干系。假如类之间是单向干系,不必要供应界说,假如类和类之间构成双向干系,我们就必要利用这个属性举行界说,不然大概引发数据分歧性的成绩。好比下面的演示场景中,我们只是界说Book类有BookExtend属性,而BookExtend并没有Book属性,那末他们是单向干系,怎样BookExtend中也界说了Book属性,那末Book和BookExtend之间就组成了双向干系。
- cascade
CascadeType[]范例。
该属性界说类和类之间的级联干系。界说的级联干系将被容器视为对以后类对象及其联系关系类对象接纳不异的操纵,并且这类干系是递回挪用的。举个例子:Book和BookExtend有级联干系,那末删除Book时将同时删除它所对应的BookExtend对象。而假如BookExtend还和其他的对象之间有级联干系,那末如许的操纵会一向递回实行下往。
cascade的值只能从CascadeType.PERSIST(级联新建)、CascadeType.REMOVE(级联删除)、CascadeType.REFRESH(级联革新)、CascadeType.MERGE(级联更新)当选择一个或多个。另有一个选择是利用CascadeType.ALL,暗示选择全体四项。
- fatch
FetchType范例的属性。
可选择项包含:FetchType.EAGER和FetchType.LAZY。前者暗示干系类在主类加载的时分同时加载,后者暗示干系类在被会见时才加载。默许值是FetchType.EAGER。
- optional
boolean范例的属性。
界说该联系关系类对是不是必需存在。假如设置为false,那末该属性就不克不及设置为null。默许值是true。
OneToOne用法举例- publicclassBook{//其他内容…@OneToOne(optional=true,cascade=CascadeType.ALL)publicBookExtendbookExtend;}
复制代码 JoinColumn
JoinColumn正文用于界说主类在数据库中对应的表经由过程甚么字段和干系类的主键举行联系关系,这个正文是可选的,假如不供应该正文,Kodo在利用”对象名_ID”和联系关系表举行联系关系(复杂情形下),好比演示场景中类Book的bookExtend没有利用JoinColumn正文举行声明,我们利用KodoEJB供应的MappingTool工具天生表格的时分,Book类对应的表Book中将主动到场列bookExtend_ID,它的范例将和BookExtend对应表的主键字段id范例坚持分歧。
JoinColumn正文中有两个属性:name和referencedColumnName属性。
- name
String范例。
它用于指定主类对应的表中和干系类的主键举行联系关系的字段的称号,好比上例中,我们不但愿利用默许的bookExtend_ID字段名举行联系关系,我们能够在Book类中利用JoinColumn正文bookExtend属性,设置JoinColumn正文为本人想要的名字好比extendID大概其他。
- referencedColumnName
String范例。
指定联系关系表中与主表构成联系关系干系的字段名。次要用于设置区分于主键字段的情形。好比BookExtend表中默许利用Id举行联系关系,但如今必要利用其他字段举行联系关系,我们就能够供应该属性。
JoinColumn用法举例- publicclassBook{//其他内容…@OneToOne(optional=true,cascade=CascadeType.ALL)@JoinColumn(name="extendID",referencedColumnName="ID")publicBookExtendbookExtend;}
复制代码 编写切合请求的耐久化类
如今我们入手下手依据下面章节中先容的内容编写切合摹拟场景中请求的Book类和BookExtend类,上面是作者编写的两个类的全体代码,代码中到场了对照多的正文便利人人了解。
Book类- packageorg.vivianj.kodo.examples.beans;importjavax.persistence.Basic;importjavax.persistence.CascadeType;importjavax.persistence.Column;importjavax.persistence.Entity;importjavax.persistence.GeneratedValue;importjavax.persistence.GenerationType;importjavax.persistence.Id;importjavax.persistence.Inheritance;importjavax.persistence.InheritanceType;importjavax.persistence.JoinColumn;importjavax.persistence.OneToOne;/***Book用于表征体系中的书本对象,他有三个属性
- *id-书本编号,书本编号将由MySQL数据库主动天生
- *name-书名
- *bookExtendC书的扩大信息,和BookExtend是一对一(OneToOne)干系*//*Entity正文暗示该类是耐久化类,的name属性是该实体在查询中对应的独一称号,默许是类名*/@Entity(name="Book")/*Table正文的name属性指定该耐久化类对应的数据表的称号,默许数据表名和类名坚持分歧,为了
- *加强代码的可移植性,倡议人人在name属性中利用年夜写英笔墨母*//*Inheritance正文的strategy断定了耐久化对象和数据表之间的干系,可选择项包含SINGLE_TABLE、JOINED和TABLE_PER_CLASS,我们这里接纳JOINED*//*TABLE_PER_CLASS:strategy设置为该选项暗示每一个类利用一个表,也就是下面所说的第一种情形*//*SINGLE_TABLE:strategy设置为该选项暗示一切类及其子类共用一个表,也就是下面所说的第二种情形*//*JOINED:strategy设置为该选项暗示每一个类利用子表保留子类比父类多出的属性,也就是下面所说的第三种情形*/@Inheritance(strategy=InheritanceType.JOINED)publicclassBook{/*Id正文暗示该字段是标识字段*/@Id/*GeneratedValue正文界说了该标识字段的发生体例,我们的演示体系中id由MySQL数据库字段主动天生,因而选择GenerationType.IDENTITY*/@GeneratedValue(strategy=GenerationType.IDENTITY)/*Column正文的name属性界说了该类属性对应的数据字段的称号,为了最年夜限制坚持体系和数据库之前的自力性,倡议利用年夜写字符*/@Column(name="ID")publicintid;/*Basic正文暗示该属性是基础属性*/@Basic/*Column正文的name属性界说了该类属性对应的数据字段的称号,为了最年夜限制坚持体系和数据库之前的自力性,倡议利用年夜写字符*/@Column(name="NAME")publicStringname=null;/*利用OneToOne正文暗示该属性和Book类构成一对一干系,OneToOne正文的option属性设为True暗示该对象能够不存在,cascade属性设置为CascadeType.ALL,暗示Book和BookExtend对象级联新建、更新、删除、革新*/@OneToOne(optional=true,cascade=CascadeType.ALL)/*利用JoinColumn正文设置两个对象对应数据库表之间的联系关系字段*/@JoinColumn(name="extendID",referencedColumnName="ID")publicBookExtendbookExtend;}
复制代码 BookExtend类- packageorg.vivianj.kodo.examples.beans;importjavax.persistence.Basic;importjavax.persistence.Column;importjavax.persistence.Entity;importjavax.persistence.GeneratedValue;importjavax.persistence.GenerationType;importjavax.persistence.Id;importjavax.persistence.Inheritance;importjavax.persistence.InheritanceType;importjavax.persistence.JoinColumn;/***BookExtend用于表征体系中书的扩大信息,他有两个属性:
- *id-扩大信息编号,扩大信息编号将由MySQL数据库主动天生
- *name-书的媒介信息
- *//*Entity正文暗示该类是耐久化类,的name属性是该实体在查询中对应的独一称号,默许是类名*/@Entity/*Table正文的name属性指定该耐久化类对应的数据表的称号,默许数据表名和类名坚持分歧,为了
- *加强代码的可移植性,倡议人人在name属性中利用年夜写英笔墨母*//*Inheritance正文的strategy断定了耐久化对象和数据表之间的干系,可选择项包含
- *SINGLE_TABLE、JOINED和TABLE_PER_CLASS,我们这里接纳JOINED*//*TABLE_PER_CLASS:strategy设置为该选项暗示每一个类利用一个表,也就是下面所说的第一种情形*//*SINGLE_TABLE:strategy设置为该选项暗示一切类及其子类共用一个表,也就是下面所说的第二种情形*//*JOINED:strategy设置为该选项暗示每一个类利用子表保留子类比父类多出的属性,也就是下面所说的第三种情形*/@Inheritance(strategy=InheritanceType.JOINED)publicclassBookExtend{/*Id正文暗示该字段是标识字段*/@Id/*GeneratedValue正文界说了该标识字段的发生体例,我们的演示体系中id由MySQL数据库字段主动天生,因而选择GenerationType.IDENTITY*/@GeneratedValue(strategy=GenerationType.IDENTITY)/*Column正文的name属性界说了该类属性对应的数据字段的称号,为了最年夜限制坚持体系和数据库之前的自力性,倡议利用年夜写字符*/@Column(name="ID")publicintid;/*Basic正文暗示该属性是基础属性*/@Basic/*Column正文的name属性界说了该类属性对应的数据字段的称号,为了最年夜限制坚持体系和数据库之前的自力性,倡议利用年夜写字符*/@Column(name="NAME")publicStringname=null;}
复制代码 挪用代码
下面的代码中,我们已筹办好了切合请求的耐久化类,上面我们看看KodoEJB中怎样挪用这两个类完成Book类和BookExtend类的创立、修正、删除事情。
因为篇幅的干系,这些没有报告怎样编译、增强这些类而且筹办响应的设置文件来完成全部项目开辟情况的创建,这部分的内容请参考我的别的一篇文章《KodoEJB:切合EJB3标准的耐久层框架》
级联新建对象
上面的这段代码演示了只必要挪用Book类的persist办法就同时耐久化Book类对象和BookExtend类对象的情形。请注重个中用粗体标识出的部分。- /*取得EJB的实体办理器*/EntityManagerFactoryemf=Persistence.createEntityManagerFactory(null);EntityManagerem=emf.createEntityManager(PersistenceContextType.EXTENDED);/*入手下手事件*/em.getTransaction().begin();/*创立新的Book对象*/Bookbook=newBook();/*设置Book对象的name属性*/book.name="Kodo进门";/*创立新的BookExtend对象*/BookExtendbookExtend=newBookExtend();/*设置对象属性*/bookExtend.name="Springisaverygoodbookthat...";/*创建对象之间的干系*/book.bookExtend=bookExtend;/*耐久化对象,只必要耐久化Book对象,不必要独自耐久化bookExtend对象*/em.persist(book);/*停止事件*/em.getTransaction().commit();em.close();emf.close();
复制代码 级联更新对象形态
上面的这段代码演示了只必要挪用Book类的merge办法就同时更新Book类对象和BookExtend类对象形态的情形。请注重个中用粗体标识出的部分。- /*取得EJB的实体办理器*/EntityManagerFactoryemf=Persistence.createEntityManagerFactory(null);EntityManagerem=emf.createEntityManager(PersistenceContextType.EXTENDED);/*入手下手事件*/em.getTransaction().begin();/*创立新的Book对象*/Bookbook=newBook();/*设置Book对象的id属性*/book.id=1;book.name=“Kodo进门”;/*创立新的BookExtend对象*/BookExtendbookExtend=newBookExtend();/*设置对象属性*/bookExtend.id=1;bookExtend.name="Kodo分为KodoEJB和KodoJDO...";/*创建对象之间的干系*/book.bookExtend=bookExtend;/*耐久化对象,只必要挪用Book对象的merge办法,不必要独自处置bookExtend对象*/em.merge(book);/*停止事件*/em.getTransaction().commit();em.close();emf.close();
复制代码 级联删除对象- /*取得EJB的实体办理器*/EntityManagerFactoryemf=Persistence.createEntityManagerFactory(null);EntityManagerem=emf.createEntityManager(PersistenceContextType.EXTENDED);/*入手下手事件*/em.getTransaction().begin();/*利用查询删除对象,能够不用将对象到场到内存中,进步效力*/Queryq=entityManager.createQuery("deletefromBookcWHEREc.id=:id");intid=book.id;/*设置被删除Book对象的主键值*/q.setParameter("id",id);/*当办法被挪用时,Book对象对应的BookExtend对象会同时被删除*/q.executeUpdate();/*停止事件*/em.getTransaction().commit();em.close();emf.close();
复制代码 其他几种联系关系干系
一对多
我们可使用OneToMany正文来形貌类和类之间的一对多干系,OneToMany正文有四个属性:targetEntity、mappedBy、cascade和fetch,这四个属性的详细寄义和OneToOne正文正文的同名属性逐一对应,请人人参考后面章节中的内容。
多对一
我们可使用ManyToOne正文来形貌类和类之间的多对一干系,ManyToOne正文有四个属性:targetEntity、cascade、fetch和optional,这四个属性的详细寄义和OneToOne正文正文的同名属性逐一对应,请人人参考后面章节中的内容。
多对多
我们可使用ManyToMany正文来形貌类和类之间的多对多干系,ManyToMany正文有四个属性:targetEntity、mappedBy、cascade和fetch,这四个属性的详细寄义和OneToOne正文正文的同名属性逐一对应,请人人参考后面章节中的内容。
总结
对象和对象之间除承继干系以外,还存在着联系关系干系,包含一对1、一对多、多对一和多对多的干系,本文中,作者以一对一干系为例,分离复杂的例子,具体地形貌了怎样在KodoEJB框架下经由过程正文复杂的形貌类和类之间的干系,而且完成类操纵的级联特征。文章的最初复杂的申明了KodoEJB中完成一对多、多对一和多对多时必要用到的正文,详细的完成请人人参考文档中的内容自行完成。
再举这样一个例子:如果你想对一个数字取绝对值,你会怎么做呢?java的做法是intc=Math.abs(-166);而ruby的做法是:c=-166.abs。呵呵,这就看出了java与ruby的区别。 |
|