怎么用@spring获得bean的方式式写datasource

5048人阅读
spring(4)
一般在配置数据源是都会使用xml的方式注入,key-value在properties中管理;spring4.X已有着比较完善的注解来替换xml的配置方式。
使用xml配置数据源
通常我们使用xml配置数据源,使用SpEL获取properties中的配置。
applicationContext.xml 中配置 dataSource 及 PreferencesPlaceholderConfigurer,使用 PropertyPlaceholderConfigurer进行Bean属性替换
id="configProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean"&
name="locations"&
&classpath:/jdbc.properties&
name="fileEncoding" value="utf-8"/&
id="propertyConfigurer" class="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer"&
name="properties" ref="configProperties" /&
id="dataSource" class="org.logicalcobwebs.proxool.ProxoolDataSource"&
name="alias" value="${proxool.alias}" /&
name="driver" value="${proxool.driver}" /&
name="driverUrl" value="${proxool.driverUrl}" /&
name="user" value="${proxool.user}" /&
name="password" value="${proxool.password}" /&
name="maximumConnectionCount" value="${proxool.maximumConnectionCount}" /&
name="minimumConnectionCount" value="${proxool.minimumConnectionCount}" /&
jdbc.properties
proxool.alias=mySql
proxool.driver=com.mysql.jdbc.Driver
proxool.driverUrl=jdbc:mysql://localhost:3306/test?characterEncoding=utf8
proxool.user=root
proxool.password=root
proxool.maximumActiveTime=1200
proxool.maximumConnectionCount=50
使用javaBean配置数据源
DataSourceConfiguration类是数据源的javaBean配置方式,@Configuratio注解当前类,
spring启动时会扫描被@Configuratio注解的类,注入当前类中配置的方法bean;
当然别忘了启用注解扫描:
&context:annotation-config/&
&context:component-scan base-package="com.XXX.test.dateSource"&&/context:component-scan&
@value注解读取配置
@value中可以直接使用SpEL,获取properties配置,成员变量也不需要getter、setter,不过还是有一个前提,需要配置xml:
&bean id="configProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean"&
&property name="locations"&
&value&classpath:/jdbc.properties&/value&
&/property&
&property name="fileEncoding" value="utf-8"/&
&bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer"&
&property name="properties" ref="configProperties" /&
@Bean注解:spring扫面当前类时,注入每个有@Bean注解的方法的返回值Bean, name属性默认为返回值类类名首字母小写,这里自己设置name。
package com.XXX.test.dateS
import org.logicalcobwebs.proxool.ProxoolDataS
import org.springframework.beans.factory.annotation.A
import org.springframework.beans.factory.annotation.V
import org.springframework.context.annotation.B
import org.springframework.context.annotation.C
@Configuratio
public class DataSourceConfiguration{
@Value("${proxool.alias}")
@Value("${proxool.driver}")
@Value("${proxool.driverUrl}")
private String driverU
@Value("${proxool.user}")
@Value("${proxool.password}")
@Bean(name="dataSource")
public ProxoolDataSource dataSource(){
ProxoolDataSource proxoolDataSource = new ProxoolDataSource();
proxoolDataSource.setDriver(driver);
proxoolDataSource.setDriverUrl(driverUrl);
proxoolDataSource.setUser(user);
proxoolDataSource.setPassword(password);
return proxoolDataS
这时dataSource已被注入,使用时可注解注入,如下:
@Autowired
private ProxoolDataSource dataS
@PropertySource注解读取配置
@PropertySource注解当前类,参数为对应的配置文件路径,这种方式加载配置文件,可不用在xml中配置PropertiesFactoryBean引入jdbc.properties,使用时方便得多,DataSourceConfiguration不再需要成员变量,取而代之的是需要注入一个Environment环境配置,使用env.getProperty(key)获取数据:
package com.XXX.test.dateSource
import org.logicalcobwebs.proxool.ProxoolDataSource
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.beans.factory.annotation.Value
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.context.annotation.PropertySource
import org.springframework.core.env.Environment
@Configuratio
@PropertySource("classpath:/jdbc.properties")
public class DataSourceConfiguration{
@Autowired
private Environment env
@Bean(name="dataSource")
public ProxoolDataSource dataSource(){
ProxoolDataSource proxoolDataSource = new ProxoolDataSource()
proxoolDataSource.setDriver(env.getProperty("proxool.alias"))
proxoolDataSource.setDriverUrl(env.getProperty("proxool.driver"))
proxoolDataSource.setUser(env.getProperty("proxool.user"))
proxoolDataSource.setPassword(env.getProperty("proxool.password"))
return proxoolDataSource
这里主要是说明注解的用法,所以没有具体体现数据源全部参数的配置。对于有强迫症的来说若项目中所有bean都使用注解,几乎不太希望仅dataSource用xml类配置,换成类的方式类配置强迫感就消失了!
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:40592次
排名:千里之外
原创:27篇
评论:47条
(9)(3)(2)(2)(1)(4)(1)(4)(1)如何创建 DataSource - Nutz
无匹配结果,请重新输入
如何创建 DataSource
何为DataSource
先看看JDK中对DataSource的描述:
作为 DriverManager 工具的替代项,DataSource 对象是获取连接的首选方法。
基本实现 - 生成标准的 Connection 对象
连接池实现 - 生成自动参与连接池的 Connection 对象。此实现与中间层连接池管理器一起使用。
简单来说,就是获取数据库连接的一个通用接口, 常见的dbcp,c3p0,druid都是DataSource的实现.
NutDao也选用DataSource作为获取数据库连接的方式, 且只调用其无参数的getConnection()方法,
也是大部分数据库连接池唯一支持的方法.
提醒一下, DataSource只是接口,不等于连接池
NutDao不挑剔任何连接池/DataSource实现,只要实现了DataSource接口就行,不存在是否支持"XXXX连接池"的问题
这篇文档该怎么用?
直接书写 Java 代码
请使用DaoUp类
通过 Nutz.Ioc 的 JSON 配置文件
Nutz项目中最常见的配置方式, 由NutIoc来管理DataSource和NutDao实例
特别强调, NutDao与NutIoc没有任何依赖关系, NutDao在NutIoc看来,只是普通的bean
严禁new NutIoc然后单单为了获取一个Dao实例!!
通过 Nutz.Ioc 的 XML 配置文件
满足XML强迫症的程序猿, 功能与JSON配置文件类似
再特别特别强调
NutDao几乎不需要任何配置文件(只有一个nutz_jdbc_experts.js 绝大部分时间你不会遇到它!)
本文说到的js/xml文件,都是NutIoc的文件,不是NutDao的配置文件!!
不要重复创建DataSource,不要重复创建NutDao!!!!!!!
务必参考本小节末尾的提醒!!
内置的SimpleDataSource
Nutz内置,无需额外下载其他连接池/DataSource实现,方便尝试NutDao的功能.
不要生产环境中使用这个DataSource!!
不要用它来测试NutDao的性能!!
自动加载NutDao所支持的数据库的驱动(说白了就是我们认识那几款,不就Class.forName一下嘛)
无额外依赖,适合新手试用
非连接池,配置简单
Oracle数据库不能使用,原因是Oracle的数据库连接是重量级的,必须用连接池才不会崩
完整的NutDao配置js文件
var ioc = {
type : "org.nutz.dao.impl.NutDao",
args : [{refer:"dataSource"}]
dataSource : {
type : "org.nutz.dao.impl.SimpleDataSource",
fields : {
jdbcUrl : 'jdbc:postgresql://localhost:5432/mydatabase',
username : 'demo',
password : '123456'
如何使用这些配置? 请看文章末尾.
Druid(推荐)
国产精品连接池,淘宝温少诚意出品,带强大的监控功能哦, 推荐1.0.25+
druid : 通过 Nutz.Ioc 的 JSON 配置文件
dataSource : {
type : "com.alibaba.druid.pool.DruidDataSource",
events : {
depose : 'close'
fields : {
url : "jdbc:postgresql://localhost:5432/mydatabase",
username : "enzozhong",
password : "123",
maxWait: 15000, // 若不配置此项,如果数据库未启动,druid会一直等可用连接,卡住启动过程
defaultAutoCommit : false // 提高fastInsert的性能
Apache DBCP
dbcp: 通过 Nutz.Ioc 的 JSON 配置文件
dataSource : {
type : "mons.dbcp.BasicDataSource",
events : {
depose : 'close'
fields : {
driverClassName : 'org.postgresql.Driver',
url : 'jdbc:postgresql://localhost:5432/mydatabase',
username : 'demo',
password : '123456'
C3P0(不推荐)
c3p0: 通过 Nutz.Ioc 的 JSON 配置文件
dataSource : {
type : "com.mchange.boPooledDataSource",
events : {
depose : 'close'
fields : {
driverClass : 'org.postgresql.Driver',
jdbcUrl : 'jdbc:postgresql://localhost:5432/mydatabase',
user : 'demo',
password : '123456'
Proxool(严重不推荐)
proxool: 通过 Nutz.Ioc 的 JSON 配置文件
dataSource : {
type : "org.logicalcobwebs.proxool.ProxoolDataSource",
fields : {
driver : 'org.postgresql.Driver',
driverUrl : 'jdbc:postgresql://localhost:5432/mydatabase',
user : 'demo',
password : '123456'
容器提供的连接池(JNDI)
Java代码方式:
不写了,这个大家都懂,不懂的自己去google查. 别跟我说baidu没查到!!
由于是通过JNDI获取,所以不再是一个Ioc的bean, 我们只需要引用它就可以了,不需要再写dataSource的bean.例如:
type : "org.nutz.dao.impl.NutDao",
args : [{jndi:"jdbc/dataSource"}]
指一些不能提供连接池或自定义获取Connection的项目,可以实现如下封装类,代理为DataSource
public class MyDataSource implements DataSource {
public Connection getConnection() throws SQLException {
// 调用遗留系统中获取数据库连接的方法即可
// 还有其他一些方法,全部默认实现就可以了,不会调用到.
type : "org.nutz.dao.impl.NutDao",
args : [{refer:"dataSource"}]
dataSource : {
type : "net.wendal.nutzbook.MyDataSource"
如何使用这些配置
推荐使用org.nutz.dao.util.DaoUp类,非Mvc环境下的全生命周期Dao工具.下面描述的是纯手工创建的代码.
Java代码的方式:
//创建dataSource,以DBCP为例, 代码仅供演示,实际使用的话必须单例或使用DaoUp类(推荐)
DataSource ds = new BasicDataSource();
ds.setDriverClassName("org.postgresql.Driver");
ds.setUrl("jdbc:postgresql://localhost:5432/mydatabase");
ds.setUsername("demo");
ds.setPassword("123456");
Dao dao = new NutDao(ds);//实际使用的话必须单例或使用DaoUp类(推荐)
dao.create(User.class, true);
dao.insert(User.create("wendal","123456"));
//.... ... ...
//所有操作都已经完成,关闭连接池,退出系统
ds.close();
//额外提醒,NutDao是线程安全的,请不要多次创建NutDao,除非你有多个DataSource
通过 Nutz.Ioc 的 JSON 配置文件
//将配置信息保存到dao.js,并存放于src文件夹下. 代码仅供演示,实际使用的话必须单例
Ioc ioc = new NutIoc(new JsonLoader("dao.js"));
DataSource ds = ioc.get(DataSource.class);
Dao dao = new NutDao(ds); //如果已经定义了dao,那么改成dao = ioc.get(Dao.class);
dao.create(User.class, true);
dao.insert(User.create("wendal","123456"));
ioc.depose(); //关闭Ioc容器
通过 Nutz.Ioc 的 XML 配置文件
//将配置信息保存到dao.xml,并存放于src文件夹下. 代码仅供演示,实际使用的话必须单例
Ioc ioc = new NutIoc(new XmlIocLoader("dao.xml"));
DataSource ds = ioc.get(DataSource.class);
Dao dao = new NutDao(ds); //如果已经定义了dao,那么改成dao = ioc.get(Dao.class);
dao.create(User.class, true);
dao.insert(User.create("wendal","123456"));
ioc.depose(); //关闭Ioc容器
非Mvc环境建议用DaoUp类.
Mvc环境下请使用IocBy.
上面提及的Java代码均为演示(main方法中的简单示例),实际用的时候, 必须将ioc容器本身单例化(例如存放到一个static属性)
重复创建DataSource(例如反复创建ioc容器, new NutIoc(...))会导致数据库连接数耗尽.
ioc容器本身,应该尽可能作为单例, 不要创建一个ioc容器后,获取ioc对象,然后就抛弃, 例如:
绝对错误的用法
public Dao getDao() { // 无论改方法被调用一次还是N次, 均为错误!!
Ioc ioc = new NutIoc(new JsonLoader("ioc/dao.js")); // 反复创建ioc容器
return ioc.get(Dao.class); //方法返回后, ioc必然被gc, 从而触发ioc的depose事件,导致DataSource关闭!
不那么错误的用法,严重建议用DaoUp类
private static I
public Dao getDao() { // 暂不考虑线程同步的问题
if (ioc == null)
ioc = new NutIoc(new JsonLoader("ioc/dao.js"));
return ioc.get(Dao.class);
Mvc中的正确用法,使用IocBy配置ioc,尽可能通过@Inject等方式获取ioc的bean.
在无法直接获取Ioc容器的代码中,使用下列代码
// 在request作用域内
public Dao getDao() {
Mvcs.getIoc().get(Dao.class);
// 在request作用域之外
public Dao getDao() {
Mvcs.ctx().getDefaultIoc().get(Dao.class);
本页面的文字允许在和下修改和再使用。我按照老师的做法,在dao的bean中配置注入dataSource属性,结果报错:java.lang.IllegalArgumentException: 'dataSource' or 'jdbcTemplate' is required,我使用的是spring-4.3.5,我猜想是jar包版本的问题
java.lang.IllegalStateException: Failed to load ApplicationContext at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:124) at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:83) at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:117) at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:83) at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:230) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:228) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:287) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:289) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:247) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:94) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70) at org.junit.runners.ParentRunner.run(ParentRunner.java:363) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:191) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:678) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'accountDaoImpl' defined in file [E:\workspace\Spring\target\classes\com\zxt\transaction\dao\AccountDaoImpl.class]: Invocation o nested exception is java.lang.IllegalArgumentException: 'dataSource' or 'jdbcTemplate' is required at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1589) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:554) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:759) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:866) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:542) at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:128) at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:60) at org.springframework.test.context.support.AbstractDelegatingSmartContextLoader.delegateLoading(AbstractDelegatingSmartContextLoader.java:108) at org.springframework.test.context.support.AbstractDelegatingSmartContextLoader.loadContext(AbstractDelegatingSmartContextLoader.java:251) at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:98) at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:116) ... 25 moreCaused by: java.lang.IllegalArgumentException: 'dataSource' or 'jdbcTemplate' is required at org.springframework.jdbc.core.support.JdbcDaoSupport.checkDaoConfig(JdbcDaoSupport.java:111) at org.springframework.dao.support.DaoSupport.afterPropertiesSet(DaoSupport.java:44) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1648) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1585) ... 40 more
写下你的评论...
写下你的评论...
写下你的评论...
写下你的评论...
写下你的评论...
写下你的评论...
Copyright (C)
All Rights Reserved | 京ICP备 号-2spring配置datasource三种方式_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
spring配置datasource三种方式
上传于|0|0|文档简介
&&spring配置datasource三种方式,spring配置mabatis三种方式。
阅读已结束,如果下载本文需要使用0下载券
想免费下载更多文档?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩5页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢实体bean,entity 注解设置 - 光辉飞翔 - 博客园
随笔 - 285
持久化是位于JDBC之上的一个更高层抽象。持久层将对象映射到数据库,以便在查询、装载、更新或删除对象的时候,无须使用像JDBC那样繁琐的API。EJB的早期版本中,持久化是EJB平台的一部分。EJB3.0开始,持久化已经自成规范,被称为Java Persistence API。
Java Persistence API定义了一种定义,可以将常规的普通Java对象(有时被称作POJO)映射到数据库。这些普通Java对象被称作Entity Bean。除了是用Java Persistence元数据将其映射到数据库外,Entity Bean与其他Java类没有任何区别。事实上,创建一个Entity Bean对象相当于新建一条记录,删除一个Entity Bean会同时从数据库中删除对应记录,修改一个Entity Bean时,容器会自动将Entity Bean的状态和数据库同步。
Java Persistence API还定义了一种查询语言(JPQL),具有与SQL相类似的特征,只不过做了裁减,以便处理Java对象而非原始的关系表。
59.1、持久化persistence.xml配置文件
一个实体Bean应用由实体类和persistence.xml文件组成。persistence.xml文件在jar文件的META-INF目录。persistence.xml文件指定实体Bean使用的数据源及EntityManager对象的默认行为。persistence.xml文件的配置说明如下:
&?xml version="1.0" encoding="UTF-8"?&
&persistence xmlns="/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
&&&&&&&&&&&&&&&&&& xsi:schemaLocation="/xml/ns/persistence
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& /xml/ns/persistence/persistence_1_0.xsd" version="1.0"&
&&&&&&&&&&&&& &persistence-unit name="test" transaction-type="JTA"&
&&&&&&&&&&&&&&&&& &jta-data-source&java:/user&/jta-data-source&
&&&&&&&&&&&&&&&&& &properties&
&&&&&&&&&&&&&&&&&&&&&& &property name="hibernate.dialect" value="org.hibernate.dialect.SQLServerDialect"/&
&&&&&&&&&&&&&&&&& &/properties&
&&&&&&&&&&&&& &/persistence-unit&
&/persistence&
persistence-unit节点可以有一个或多个,每个persistence-unit节点定义了持久化内容名称、使用的数据源及持久化产品专有属性。name属性定义持久化名称。jta-data-source节点指定实体Bean使用的数据源JNDI名称,如果应用发布在JBoss下数据源名称带有java:/前缀,数据源名称大小写敏感。properties节点用作指定持久化产品的各项属性,各个应用服务器使用的持久化产品都不一样,如JBoss使用Hibernate,WebLogic10使用Kodo。
59.2、JBoss数据源的配置
各种数据库德数据源配置模版可以在[JBoss安装目录]\docs\examples\jca目录中找到,默认名称为:数据库名+-ds.xml。
不管使用哪种数据库都需要把它的驱动类jar包放置在[JBoss安装目录]\server\default\lib目录下,放置后需要启动JBoss服务器。
数据源文件配置好后需要放置在[JBoss安装目录]/server/default/deploy目录。
SQL Server配置代码:
&&&&&&&&&&& &?xml version="1.0" encoding="UTF-8"?&
&datasources&
&&&&&&&&&&&&& &local-tx-datasource&
&&&&&&&&&&&&&&&&&& &jndi-name&user&/jndi-name&
&&&&&&&&&&&&&&&&&& &connection-url&jdbc:sqlserver://localhost:1433;DatabaseName=rep&/connection-url&
&&&&&&&&&&&&&&&&&& &driver-class&com.microsoft.sqlserver.jdbc.SQLServerDriver&/driver-class&
&&&&&&&&&&&&&&&&&& &user-name&sa&/user-name&&&&&&&& &password&123&/password&
&&&&&&&&&&&&&&&&&& &metadata&
&&&&&&&&&&&&&&&&&&&&&& &type-mapping&MS SQLSERVER2000&/type-mapping&
&&&&&&&&&&&&&&&&&& &/metadata&
&&&&&&&&&&&&& &/local-tx-datasource&
&/datasources&
数据源发布后,可以在找到配置,如下图:
59.3、单表映射的实体Bean
59.3.1、实体Bean代码
&&&&&&&&&&& @Entity
@Table(name="tbl_user")
publicclass User implements Serializable{
&&&&&&&&&&&&&&&&&& @Id
&&&&&&&&&&&&&&&&&& @GeneratedValue(strategy = GenerationType.AUTO)
&&&&&&&&&&&&&&&&&& @Column(name="id")
&&&&&&&&&&&&&&&&&& private Integer id;
&&&&&&&&&&&&&&&&&& @Column(name="name")
&&&&&&&&&&&&&&&&&& private String name;
&&&&&&&&&&&&&&&&&& @Column(name="age")
&&&&&&&&&&&&&&&&&& private String age;
&&&&&&&&&&&&&&&&&& public String getAge() {&& returnage;& }
&&&&&&&&&&&&&&&&&& publicvoid setAge(String age) {&&&&&&& this.age =&& }
&&&&&&&&&&&&&&&&&& public String getName() {&&&&&& returnname; }
&&&&&&&&&&&&&&&&&& publicvoid setName(String name) {& this.name = }
&&&&&&&&&&&&&&&&&& public User() {&& }
&&&&&&&&&&&&&&&&&& public Integer getId() {&& returnthis.id;& }
&&&&&&&&&&&&&&&&&& publicvoid setId(Integer id) {&&&& this.id = }
从上面代码来看开发实体Bean非常简单,比起普通的JavaBean就是多了些注释。@Entity注释指名这是一个实体Bean,@Table注释指定了Entity所要映射带数据库表,其中@Table.name()用来指定映射表的表名。如果缺省@Table注释,系统默认采用类名作为映射表的表名。实体Bean的每个实例代表数据表中的一行数据,行中的一列对应实例中的一个属性。
@Column注释定义了将成员属性映射到关系表中的哪一列和该列的结构信息,属性如下:
1)name:映射的列名。如:映射tbl_user表的name列,可以在name属性的上面或getName方法上面加入;
2)unique:是否唯一;
3)nullable:是否允许为空;
4)length:对于字符型列,length属性指定列的最大字符长度;
5)insertable:是否允许插入;
6)updatetable:是否允许更新;
7)columnDefinition:定义建表时创建此列的DDL;
8)secondaryTable:从表名。如果此列不建在主表上(默认是主表),该属性定义该列所在从表的名字。
@Id注释指定表的主键,它可以有多种生成方式:
1)TABLE:容器指定用底层的数据表确保唯一;
2)SEQUENCE:使用数据库德SEQUENCE列莱保证唯一(Oracle数据库通过序列来生成唯一ID);
3)IDENTITY:使用数据库的IDENTITY列莱保证唯一;
4)AUTO:由容器挑选一个合适的方式来保证唯一;
5)NONE:容器不负责主键的生成,由程序来完成。
@GeneratedValue注释定义了标识字段生成方式。
@Temporal注释用来指定java.util.Date或java.util.Calender属性与数据库类型date、time或timestamp中的那一种类型进行映射。
@Temporal(value=TemporalType.TIME)
private Date birthday;
59.3.2、会话Bean代码
&&&&&&&&&& @Stateless
publicclass UserDAO implements UserDAORemote {
&&&&&&&&&&&&&&&&&& @PersistenceContext(unitName="test")
&&&&&&&&&&&&&&&&&& private EntityManager em;
&&&&&&&&&&&&&&&&&& publicboolean insertUser(User user){
&&&&&&&&&&&&&&&&&&&&&& try{
&&&&&&&&&&&&&&&&&&&&&&&&&&& em.persist(user);
&&&&&&&&&&&&&&&&&&&&&&&&&&& returntrue;
&&&&&&&&&&&&&&&&&&&&&& }catch(Exception e){
&&&&&&&&&&&&&&&&&&&&&&&&&&& returnfalse;
&&&&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&& }
上面使用了一个对象:EntityManager,EntityManager是由EJB容器自动地管理和配置的,不需要用户自己创建,它用作操作实体Bean。
如果persistence.xml文件中配置了多个不同的持久化内容。在注入EntityManager对象时必须指定持久化名称,可以通过@PersistenceContext注释的unitName属性进行制定。例如:
@PersistenceContext(unitName="test")
private EntityManager em;
59.4、属性映射
如果不想让一些成员属性映射成数据库字段,可以使用@Transient注释进行标注。
@Transient
private String sex;
如果想映射枚举对象到数据库就需要使用@Enumerated注释进行标注。
@Enumerated(EnumType.STRING)
@Column(name="address_type")
private AddressType type;//地址类型
有时可能需要存放一些文本或大文本数据进数据库,JDBC使用java.sql.Blob类型存放二进制数据,java.sql.Clob类型存放字符数据,这些数据都是非常占内存的,@Lob注释用作映射这些大数据类型,当属性的类型为byte[],Byte[]或java.io.Serializable时,@Lob注释映射为数据库的Blob类型,当属性的类型为char[],Character[]或java.lang.String时,@Lob注释将映射为数据库的Clob类型。
对于加了@Lob注释的大数据类型,为了避免每次加载实体时占用大量内存,有必要对该属性进行延时加载,这是需要用到@Basic注释。@Basic注释的定义:FetchType属性指定是否延时加载,默认为立即加载,optional属性指定在生成数据库结构时字段能否为null。
@Basic(fetch=FetchType.LAZY)
@Column(name="info")
private String content;
59.5、持久化实体管理器EntityManager
EntityManager是用来对实体Bean进行操作的辅助类。可以用来产生/删除持久化的实体Bean,通过主键查找实体Bean,也可以通过EJB3QL语言查找满足条件的实体Bean。实体Bean被EntityManager管理时,EntityManager跟踪他的状态改变,在任何决定更新实体Bean的时候便会把发生改变的值同步到数据库中。当实体Bean从EntityManager分离后,他是不受管理的,EntityManager无法跟踪他的任何状态改变。
59.5.1、Entity获取find()或getReference()
如果知道Entity的唯一标识符,可以用find()或getReference()方法获取Entity。
public User findUser(Integer userid){
&&&&&&&&&&&&&&&&&& returnem.find(User.class, userid);
当在数据库中没有找到记录时,getReference()和find()是有区别的,find()方法会返回null,而getReference()方法会抛出javax.persistence.EntityNotFoundException例外,另外getReference()方法不保证实体Bean已被初始化。如果传递进getReference()或find()方法的参数不是实体Bean,都会引发IllegalArgumentException。
59.5.2、添加persist()
&&&&&& @PersistenceContext(unitName="test")
&&&&&&&&&&&&& private EntityManager em;
&&&&&&&&&&&&& publicboolean insertUser(User user){
&&&&&&&&&&&&&&&&& try{
&&&&&&&&&&&&&&&&&&&&&& em.persist(user);
&&&&&&&&&&&&&&&&&&&&&& returntrue;
&&&&&&&&&&&&&&&&& }catch(Exception e){
&&&&&&&&&&&&&&&&&&&&&& returnfalse;
&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&& }
如果传递进persist()方法的参数不是实体Bean,都会引发IllegalArgumentException例外。
59.5.3、更新实体
当实体正在被容器管理时,可以调用实体的set方法对数据进行修改,在容器决定flush时,更新的数据才会同步到数据库。如果希望修改后的数据实时同步到数据库,可以执行EntityManager.flush()方法。
publicboolean updateUser(Integer userid){
&&&&&&&&&&&&&&&&& User user=(User)em.find(User.class,userid);
&&&&&&&&&&&&&&&&& try{
&&&&&&&&&&&&&&&&&&&&&& user.setName("yyyyyy");
&&&&&&&&&&&&&&&&&&&&&& returntrue;
&&&&&&&&&&&&&&&&& }catch(Exception e){
&&&&&&&&&&&&&&&&&&&&&& returnfalse;
&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&& }
59.5.4、合并merge()
merge()方法是在实体Bean已经脱离了EntityManager的管理时使用,当容器决定flush时,数据将会同步到数据库中。
publicboolean updateUser(User user){
&&&&&&&&&&&&&&&&& try{
&&&&&&&&&&&&&&&&&&&&&& em.merge(user);
&&&&&&&&&&&&&&&&&&&&&& returntrue;
&&&&&&&&&&&&&&&&& }catch(Exception e){
&&&&&&&&&&&&&&&&&&&&&& returnfalse;
&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&& }
执行em.merge(user)方法时,容器的工作规则:1)如果此时容器中已经存在一个受容器管理的具有相同ID的user实例,容器就会把参数user的内容拷贝进这个受管理的实例,merge()方法返回受管理的实例,但参数user仍然是分离的不受管理的。容器在决定Flush时把实例同步到数据库中;2)容器中不存在具有相同ID的user实例。容器根据传入的user参数拷贝出一个受容器管理的person实例,同时merge()会返回出这个受管理的实例,但是参数user仍然是分离的不受管理的。容器在决定Flush时把实例同步到数据库中。
如果传入merge()方法的参数不是实体Bean,会引发一个IllegalArgumentException例外。
59.5.5、删除remove()
&&&&&& publicboolean deleteUser(Integer id){
&&&&&&&&&&&&&&&&& try{
&&&&&&&&&&&&&&&&&&&&&& User user=em.find(User.class, id);
&&&&&&&&&&&&&&&&&&&&&& em.remove(user);
&&&&&&&&&&&&&&&&&&&&&& returntrue;
&&&&&&&&&&&&&&&&& }catch(Exception e){
&&&&&&&&&&&&&&&&&&&&&& returnfalse;
&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&& }
59.6、执行JPQL操作createQuery()
除了使用find()或getReference()方法来获得Entity Bean之外,还可以通过JPQL得到实体Bean。要执行JPQL语句,必须通过EntityManager的createQuery或createNamedQuery()方法创建一个Query对象。
public List queryList(){
&&&&&&&&&&&&& Query query=em.createQuery("select u from User u where u.id=3");
&&&&&&&&&&&&& return query.getResultList();
&&&&&&&&& }
59.6.1、执行SQL操作createNativeQuery()
这里操作的是SQL语句,并非JPQL。
Query query=em.createQuery("select * from tbl_user u");
59.6.2、刷新实体refresh()
如果怀疑当前被管理的实体已经不是数据库中最新的数据,可以通过refresh()方法刷新实体,容器会把数据库中的新值重写进实体。这种情况一般发生在获取实体之后,有人更新了数据库中的记录,这是需要得到最新数据。当然再次调用find或getReference()方法也可以得到最新数据,但这种做法并不优雅。
em.refresh(user);
59.6.3、检测实体当前是否在被管理中contains()
contains()方法是用一个实体作为参数,如果这个实体对象当前正被持久化内容管理,返回为true,否则为false。
&&&&&&&&&&&&&&&&&& User user=em.find(User.class, id);
&&&&&&&&&&&&&&&&&& if(em.contains(user)){
&&&&&&&&&&&&&&&&&&&&&&& System.out.println("被管理中");
&&&&&&&&&&&&&&&&&& }else{
&&&&&&&&&&&&&&&&&&&&&&& System.out.println("没有管理");
&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&& returntrue;
&&&&&&&&&&&&& }catch(Exception e){
&&&&&&&&&&&&&&&&&& returnfalse;
&&&&&&&&&&&&& }
59.6.4、分离所有当前正在被管理的实体clear()
在处理大量实体的时候,如果不把已经处理过的实体从EntityManager中分离出来,将会消耗大量的内存。调用EntityManager的clear()方法后,所有正在被管理的实体将会从持久化内容中分离出来。
有一点需要注意,在事务没有提交前,如果调用clear()方法之前对实体所作的任何改变将会丢失,所以建议在调用clear()方法之前先调用flush()方法保存更改。
59.6.5、将实体的改变立刻刷新到数据库中flush()
当实体管理器对象在一个Session Bean中使用时,它是和服务器的事务上下文绑定的。实体管理器在服务器的事务提交时并且同步内容。在一个Session Bean中,服务器的事务默认地会在调用堆栈的最后提交。为了只在当事务提交时才将改变更新到数据库中,容器将所有数据库操作集中到一个批量中,这样就减少了与数据库的交互。
当调用persist()、merge()或remove()这些方法时,更新并不会立刻同步到数据库中,直到容器决定刷新到数据库中时才会执行,默认情况下,容器决定刷新是在&相关查询&执行前或事务提交时发生,当然&相关查询&除find()和getReference()之外,这两个方法是不会引起容器触发刷新动作的,默认的刷新模式是可以改变的。
59.6.6、改变实体管理器的Flush模式setFlushMode()
默认情况下,实体管理器的Flush模式为AUTO。
两者的区别及使用场合:
FlushModeType.AUTO:刷新在查询语句执行前(除了find()和getReference())或事务提交时才发生,在大量更新数据的过程中没有任何查询语句的执行时使用。
MIT:刷新只在事务提交时才发生,在大量更新数据的过程中存在查询的执行时使用。
59.6.7、获取持久化实现者的引用getDelegate()
可以获取EntityManager持久化实现者的引用。
@PersistenceContext(unitName="test")
private EntityManager em;
HibernateEntityManager hibernate=(HibernateEntityManager)em.getDelegate();
59.7、关系/对象映射
59.7.1、映射的表名或列名与数据库保留字同名时的处理
当映射的表名或列名于数据库保留字同名时,持久化引擎转译后的SQL在执行时将会出错。
@Table(name=&Order&)
public class Order implements Serializable{}
表名Order与排序保留字&Order&相同,导致SQL语法出错。
针对上面的情况,在JBoss持久化产品中没有解决方案。一种变通的方法就是加上单引号或者方括号的解决方案。该方法针对具体数据库,不利于数据库移植。建议大家不要使用保留字作为表名或列名。
59.7.2、一对一映射
一对一关系,需要在关系维护端的@OneToOne注释中定义mappedBy属性。在关系被维护端建立外键列指向关系维护的主键列。
User代码:
&&&&&&&&&&& @Entity
@Table(name="tbl_user")
publicclass User& implements Serializable{
&&&&&&&&&&&&&&&&&& @Id
&&&&&&&&&&&&&&&&&& @GeneratedValue(strategy = GenerationType.AUTO)
&&&&&&&&&&&&&&&&&& private Integer id;
&&&&&&&&&&&&&&&&&& @Column(name="name")
&&&&&&&&&&&&&&&&&& private String name;
&&&&&&&&&&&&&&&&&& private String sex;
&&&&&&&&&&&&&&&&&& private String age;
&&&&&&&&&&&&&&&&&& @Temporal(value=TemporalType.DATE)
&&&&&&&&&&&&&&&&&& private Date birthday;
&&&&&&&&&&&&&&&&&& @OneToOne(optional=true,cascade=CascadeType.ALL,mappedBy="user")
&&&&&&&&&&&&&&&&&& private Card card;
&&&&&&&&&&&&&&&&&& public User() {&& }
public Card getCard() {&&&&&&&& returncard;&&&&& }
&&&&&&&&&&&&&&&&&& publicvoid setCard(Card card) {&&&&&&& this.card =&&&&& }
&&&&&&&&&&&&&&&&&& public String getAge() {&&&&&&& returnage;&&&&&& }
&&&&&&&&&&&&&&&&&& publicvoid setAge(String age) {&&&&&&& this.age =&&&&&&& }
&&&&&&&&&&&&&&&&&& public Date getBirthday() {&&&&&&&& returnbirthday;&&&&&& }
&&&&&&&&&&&&&&&&&& publicvoid setBirthday(Date birthday) { this.birthday =&&&&& }
&&&&&&&&&&&&&&&&&& public String getName() {&&&&&& returnname;&&&&& }
&&&&&&&&&&&&&&&&&& publicvoid setName(String name) {&&&&& this.name =&&&&& }
&&&&&&&&&&&&&&&&&& public String getSex() {&&&&&&& returnsex;&&&&&&&&&&& }
publicvoid setSex(String sex) {&&&&&&& this.sex =&&&&&&& }
&&&&&&&&&&&&&&&&&& public Integer getId() {&&&&&&& returnthis.id;&&&&&& }
&&&&&&&&&&&&&&&&&& publicvoid setId(Integer id) {&&&&&&&& this.id = }
&&&&&&&&&&&&&&&&&& publicint hashCode() {&&& return (this.id == null) ? 0 : this.id.hashCode();&& }
publicboolean equals(Object object) {
&&&&&&&&&&&&&&&&&&&&&& if (object instanceof User) {
&&&&&&&&&&&&&&&&&&&&&&&&&&& final User obj = (User)
&&&&&&&&&&&&&&&&&&&&&&&&&&& return (this.id != null) ? this.id.equals(obj.id)&&& : (obj.id == null);
&&&&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&&&&&& returnfalse;
&&&&&&&&&&&&&&&&&& }
@OneToOne注释指明User与Card为一对一关系,@OneToOne注释有5个属性:targetEntity、cascade、fetch、optional和mappedBy。
1)targetEntity:Class类型的属性
2)mappedBy:String类型的属性。定义类之间的双向关联。如果类之间是单向关系,不需要提供定义,如果类和类之间形成双向关系。就需要使用这个属性进行定义,否则可能引起数据一致性的问题。
3)cascade:CascadeType类型。该属性定义类和类之间的级联关系。定义级联关系将被容器视为当前类对象及其关联类对象采取相同的操作,而且这种关系是递归的。cascade的值只能从CascadeType.PERSIST(级联新建)、CascadeType.REMOVE(级联删除)、CascadeType.REFRESH(级联刷新)、Cascade.MERGE(级联更新)中选择一个或多个。还有一个选择是使用CascadeType.ALL,表示选择全部四项。
4)fetch:FetchType类型的属性。可选择项包括:FetchType.EAGER和FetchType.LAZY。前者表示关系类在主体类加载的时候同时加载,后者表示关系类在被访问时才加载。默认值是FetchType.LAZY。
5)optional:表示被维护对象是否需要存在。如果为真,说明card属性可以null,也就是允许没有身份证,未成年人就是没有身份证。
Card代码:
@Table(name="tbl_card")
publicclass Card implements Serializable{
&&&&&&&&&&&&&&&&&& @Id
&&&&&&&&&&&&&&&&&& @GeneratedValue(strategy = GenerationType.AUTO)
&&&&&&&&&&&&&&&&&& @Column(name="id")
&&&&&&&&&&&&&&&&&& private Integer id;
&&&&&&&&&&&&&&&&&& @Column(name="cardno")
&&&&&&&&&&&&&&&&&& private String cardno;
&&&&&&&&&&&&&&&&&& @OneToOne(optional=false,cascade=CascadeType.REFRESH)
&&&&&&&&&&&&&&&&&& @JoinColumn(referencedColumnName="id")
&&&&&&&&&&&&&&&&&& private User user;
public Card() {&& }
&&&&&&&&&&&&&&&&&& public User getUser() {&&&&&&&& returnuser; }
&&&&&&&&&&&&&&&&&& publicvoid setUser(User user) {&&&&&&& this.user =&&&&& }
&&&&&&&&&&&&&&&&&& public String getCardno() {&&&&&&&& returncardno;&&&&&&&& }
&&&&&&&&&&&&&&&&&& publicvoid setCardno(String cardno) {&&&&&& this.cardno =&&&&&& }
&&&&&&&&&&&&&&&&&& public Integer getId() {&&&&&&& returnthis.id;&&&&&& }
&&&&&&&&&&&&&&&&&& publicvoid setId(Integer id) {&&&&&&&& this.id = }
&&&&&&&&&&&&&&&&&& publicint hashCode() {&&&&&&& return (this.id == null) ? 0 : this.id.hashCode();&&&&&&& }
&&&&&&&&&&&&&&&&&& publicboolean equals(Object object) {
&&&&&&&&&&&&&&&&&&&&&& if (object instanceof Card) {
&&&&&&&&&&&&&&&&&&&&&&&&&&& final Card obj = (Card)
&&&&&&&&&&&&&&&&&&&&&&&&&&& return (this.id != null) ? this.id.equals(obj.id)&&& : (obj.id == null);
&&&&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&&&&&& returnfalse;
&&&&&&&&&&&&&&&&&& }
@OneToOne注释指明Card与User为一对一关系,Card是关系被维护端,optional=false设置user属性值不能为空,也就是身份证必须有对应的主人。@JoinColumn(name=&user_id& referencedColumnName=&id& unique=&true&)指明tbl_card表的user_id列作为外键与tbl_user表的person_id列进行关联,unique=true指明user_id列的值不可重复。
59.7.3、一对多及多对一映射
@Table(name="tbl_order")
publicclass Order implements Serializable{
&&&&&&&&&&&&&&&&&& @Id
&&&&&&&&&&&&&&&&&& @GeneratedValue(strategy = GenerationType.AUTO)
&&&&&&&&&&&&&&&&&& @Column(name="order_id")
&&&&&&&&&&&&&&&&&& private Integer id;
&&&&&&&&&&&&&&&&&& private String name;
&&&&&&&&&&&&&&&&&& @OneToMany(targetEntity=OrderItem.class,cascade=CascadeType.ALL,mappedBy="order")
&&&&&&&&&&&&&&&&&& private Set set=new HashSet();
&&&&&&&&&&&&&&&&&& public Order() { }
&&&&&&&&&&&&&& public String getName() {&&&&&& returnname;&&&&& }
&&&&&&&&&&&&&&&&&& publicvoid setName(String name) {&&&&& this.name =&&&&& }
&&&&&&&&&&&&&&&&&& public Set getSet() {&&&&& returnset;&&&&&& }
&&&&&&&&&&&&&&&&&& publicvoid setSet(Set set) {&&&&&& this.set =&& }
&&&&&&&&&&&&&&&&&& public Integer getId() {&& returnthis.id;&&&&&& }
&&&&&&&&&&&&&&&&&& publicvoid setId(Integer id) {&&&& this.id = }
&&&&&&&&&&&&&&&&&& publicint hashCode() {&&& return (this.id == null) ? 0 : this.id.hashCode();&& }
&&&&&&&&&&&&&&&&&& publicboolean equals(Object object) {
&&&&&&&&&&&&&&&&&&&&&& if (object instanceof Order) {
&&&&&&&&&&&&&&&&&&&&&&&&&&& final Order obj = (Order)
&&&&&&&&&&&&&&&&&&&&&&&&&&& return (this.id != null) ? this.id.equals(obj.id)&&& : (obj.id == null);
&&&&&&&&&&&&&&&&&&&&&& returnfalse;
&&&&&&&&&&&&&&&&&& }
---------------------------------------------------------------------------------------------------------
@Table(name="tbl_item")
publicclass OrderItem implements Serializable{
&&&&&&&&&&&&&&&&&& @Id
&&&&&&&&&&&&&&&&&& @GeneratedValue(strategy = GenerationType.AUTO)
&&&&&&&&&&&&&&&&&& @Column(name="item_id")
&&&&&&&&&&&&&&&&&& private Integer id;
&&&&&&&&&&&&&&&&&& private String goodsname;
&&&&&&&&&&&&&&&&&& @ManyToOne(cascade=CascadeType.REFRESH,optional=false)
&&&&&&&&&&&&&&&&&& @JoinColumn(name="item_order_id",referencedColumnName="order_id")
&&&&&&&&&&&&&&&&&& private Order order;
&&&&&&&&&&&&&&&&&& public OrderItem() {& }
&&&&&&&&&&&&&& public String getGoodsname() {&&&&& returngoodsname;&&&&& }
&&&&&&&&&&&&&&&&&& publicvoid setGoodsname(String goodsname) {&&&&& this.goodsname =&&&&& }
&&&&&&&&&&&&&&&&&& public Order getOrder() {&&&&&& returnorder;&&&&&&&&& }
publicvoid setOrder(Order order) { this.order =&&& }
&&&&&&&&&&&&&&&&&& public Integer getId() {&& returnthis.id;&&&&&& }
&&&&&&&&&&&&&&&&&& publicvoid setId(Integer id) {&&&& this.id = }
publicint hashCode() {&&& return (this.id == null) ? 0 : this.id.hashCode();&& }
&&&&&&&&&&&&&&&&&& publicboolean equals(Object object) {
&&&&&&&&&&&&&&&&&&&&&& if (object instanceof OrderItem) {
&&&&&&&&&&&&&&&&&&&&&&&&&&& final OrderItem obj = (OrderItem)
&&&&&&&&&&&&&&&&&&&&&&&&&&& return (this.id != null) ? this.id.equals(obj.id)&&& : (obj.id == null);
&&&&&&&&&&&&&&&&&&&&&& returnfalse;
&&&&&&&&&&&&&&&&&& }
59.7.4、多对多映射
@Table(name="tbl_student")
publicclass Student implements Serializable{、
&&&&&&&&&&&&&&&&&& @Id
&&&&&&&&&&&&&&&&&& @GeneratedValue(strategy = GenerationType.AUTO)
&&&&&&&&&&&&&&&&&& @Column(name="student_id")
&&&&&&&&&&&&&&&&&& private Integer id;
&&&&&&&&&&&&&&&&&& private String name;
&&&&&&&&&&&&&&&&&& @ManyToMany(cascade=CascadeType.ALL,targetEntity=Teacher.class)
&&&&&&&&&&&&&&&&&& @JoinTable(name="tbl_stu_teacher",inverseJoinColumns={
&&&&&&&&&&&&&&&&&&&&&&&&&&& @JoinColumn(name="teacher_id",referencedColumnName="teacher_id")},
&&&&&&&&&&&&&&&&&&&&&&&&&&& joinColumns={@JoinColumn(name="student_id",referencedColumnName="student_id")})
&&&&&&&&&&&&&&&&&& private Set set=new HashSet();
&&&&&&&&&&&&&&&&&& public Student() {&&& }
&&&&&&&&&&&&&&&&&& public String getName() {&&&&&& returnname; }
&&&&&&&&&&&&&& publicvoid setName(String name) {& this.name = }
&&&&&&&&&&&&&&&&&& public Set getSet() {&&&&& returnset;&&&&&& }
&&&&&&&&&&&&&&&&&& publicvoid setSet(Set set) {&&&&&& this.set =&& }
&&&&&&&&&&&&&&&&&& public Integer getId() {&& returnthis.id;&&&&&& }
&&&&&&&&&&&&&&&&&& publicvoid setId(Integer id) {&&&& this.id = }
&&&&&&&&&&&&&&&&&& publicint hashCode() {&&& return (this.id == null) ? 0 : this.id.hashCode();&& }
&&&&&&&&&&&&&&&&&& publicboolean equals(Object object) {
&&&&&&&&&&&&&&&&&&&&&& if (object instanceof Student) {
&&&&&&&&&&&&&&&&&&&&&&&&&&& final Student obj = (Student)
&&&&&&&&&&&&&&&&&&&&&&&&&&& return (this.id != null) ? this.id.equals(obj.id)&&& : (obj.id == null);
&&&&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&&&&&& returnfalse;
&&&&&&&&&&&&&&&&&& }
-------------------------------------------------------------------------------------------------------------
@Table(name="tbl_teacher")
publicclass Teacher implements Serializable{
&&&&&&&&&&&&&&&&&& @Id
&&&&&&&&&&&&&&&&&& @GeneratedValue(strategy = GenerationType.AUTO)
&&&&&&&&&&&&&&&&&& @Column(name="teacher_id")
&&&&&&&&&&&&&&&&&& private Integer id;
&&&&&&&&&&&&&&&&&& private String name;
&&&&&&&&&&&&&&&&&& @ManyToMany(targetEntity=Student.class,mappedBy="set")
&&&&&&&&&&&&&&&&&& private Set set=new HashSet();
&&&&&&&&&&&&&&&&&& public Teacher() {&&& }
&&&&&&&&&&&&&& public String getName() {&&&&&& returnname;&&&&& }
&&&&&&&&&&&&&&&&&& publicvoid setName(String name) {&&&&& this.name =&&&&& }
&&&&&&&&&&&&&&&&&& public Set getSet() {&&&&& returnset;&&&&&& }
&&&&&&&&&&&&&&&&&& publicvoid setSet(Set set) {&&&&&& this.set =&& }
&&&&&&&&&&&&&&&&&& public Integer getId() {&& returnthis.id;&&&&&& }
&&&&&&&&&&&&&&&&&& publicvoid setId(Integer id) {&&&& this.id = }
&&&&&&&&&&&&&&&&&& publicint hashCode() {&&& return (this.id == null) ? 0 : this.id.hashCode();&& }
&&&&&&&&&&&&&&&&&& publicboolean equals(Object object) {
if (object instanceof Teacher) {
&&&&&&&&&&&&&&&&&&&&&&&&&&& final Teacher obj = (Teacher)
&&&&&&&&&&&&&&&&&&&&&&&&&&& return (this.id != null) ? this.id.equals(obj.id)&&& : (obj.id == null);
&&&&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&&&&&& returnfalse;
&&&&&&&&&&&&&&&&&& }
阅读(...) 评论()

我要回帖

更多关于 bean的注入方式有几种 的文章

 

随机推荐