注解

本文详细介绍了Hibernate和Spring框架中的关键注解,包括@Transient、@Entity、@Id等Hibernate注解以及@Autowired、@Resource等Spring注解。探讨了它们在实体映射、依赖注入及AOP等方面的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、hibernate

参考: http://mygirl1314520.iteye.com/blog/1041904

@Transient:Entity里面如果有数据库表中没有的字段,该字段要加@Transient
@Entity 注解将一个类声明为实体 Bean
@Id 注解声明了该实体Bean的标识属性。@Id注解可将实体Bean中某个属性定义为主键,使用@GenerateValue注解可以定义该标识符的生成策略。AUTO- 
可以是 identity column, sequence 或者 table类型,取决于不同底层的数据库 ;TABLE - 使用table保存id值 ;IDENTITY - identity column;SEQUENCE - sequence .
@Id @GeneratedValue(strategy=GenerationType.SEQUENCE,generator="SEQ_STORE")
@Table 为实体Bean指定对应数据库表,目录和schema的名字。 @Table(name="tbl_sky")
@Version 注解用于支持乐观锁版本控制。@Version          @Column(name="OPTLOCK")
实体Bean中所有非static 非 transient 属性都可以被持久化,除非用@Transient注解。
默认情况下,所有属性都用 @Basic 注解。
@TemporalType.(DATE,TIME,TIMESTAMP) 分别Map java.sql.(Date, Time,Timestamp).
@Lob 注解属性将被持久化为 Blog 或 Clob 类型。String //clobtype      byte[]// blog type
@Column 注解将属性映射到列。eg:@Column(updatable = false, name ="flight_name", nullable = false, length=50)
@Embeddable:组件类必须在类一级定义 @Embeddable 注解。在特定的实体关联属性上使用 @Embeddable 和@AttributeOverride 注解可以覆盖该属性对应的嵌入式对象的列映射。
使用 @OneToOne 注解可以建立实体Bean之间的一对一关系。关联的实体都共享同样的主键: @OneToOne(cascade=CascadeType.ALL)          @PrimaryKeyJoinColumn ;
使用 @ManyToOne注解定义多对一关系。          @ManyToOne( cascade = {CascadeType.PERSIST, CascadeType.MERGE})      @JoinColumn(name="COMP_ID")
@OneToMany 注解可定义一对多关联。一对多关联可以是双向的。@ManyToOne  @JoinColumn(name="troop_fk")         
当OneToMany中加上fetch=FetchType.EAGER时,查询时会把关联的对象全部加载到内存中,即使使用setFetchMode,也不起作用,而去掉fetch=FetchType.EAGER时,setFetchMode才起作用。
CascadeType.REFRESH:级联刷新,当多个用户同时作操作一个实体,为了用户取到的数据是实时的,在用实体中的数据之前就可以调用一下refresh()方法!
CascadeType.REMOVE:级联删除,当调用remove()方法删除Order实体时会先级联删除OrderItem的相关数据!
CascadeType.MERGE:级联更新,当调用了Merge()方法,如果Order中的数据改变了会相应的更新OrderItem中的数据;
CascadeType.ALL:包含以上所有级联属性。
(注:以上几种级联操作,只能实在满足数据库的约束时才能生效,比如上边的Order和OrderItem存在主外键关联所以执行REMOVE()方法时是不能实现级联删除的)
CascadeType.PERSIST:级联保存,当调用了Persist() 方法,会级联保存相应的数据
1-m,多的一方为关系维护端,关系维护端负责外键记录的更新,关系被维护端没有权利更新外键记录

-------------------------------------------------------------------------------------------------------------
以下引自: http://chinahanqingtao.blog.sohu.com/94531275.html
(有举例,本处省略)

@OneToMany的属性:
1>targetEntity
定义关系类的类型,默认是该成员属性对应的类类型,所以通常不需要提供定义。
2>mappedBy
定义类之间的双向关系。如果类之间是单向关系,不需要提供定义,如果类和类之间形成双向关系,我们就需要使用这个属性进行定义,否则可能引起数据一致性的问题。
该属性的值是“多”方class里的“一”方的变量名
3>cascade
该属性定义类和类之间的级联关系。定义的级联关系将被容器视为对当前类对象及其关联类对象采取相同的操作,而且这种关系是递归调用的。举个例子:Order和OrderItem有级联关系,那么删除Order时将同时删除它所对应的OrderItem对象。而如果OrderItem还和其他的对象之间有级联关系,那么这样的操作会一直递归执行下去。
cascade的值只能从CascadeType.PERSIST(级联新建)、CascadeType.REMOVE(级联删除)、CascadeType.REFRESH(级联刷新)、CascadeType.MERGE(级联更新)中选择一个或多个。还有一个选择是使用CascadeType.ALL,表示选择全部四项。
4>fatch
可选择项包括:FetchType.EAGER和FetchType.LAZY。前者表示关系类(本例是OrderItem类)在主类(本例是Order类)加载的时候同时加载,后者表示关系类在被访问时才加载。默认值是FetchType.LAZY。
@JoinColumn(name = "order_id")注释指定OrderItem映射表的order_id列作为外键与Order映射表的主键列关联。
@ManyToOne:指明OrderItem和Order之间为多对一关系。
@ManyToOne注释有四个属性:targetEntity、cascade、fetch和optional,前三个属性的具体含义和@OneToMany的同名属性相同,但@ManyToOne的fetch属性默认值是FetchType.EAGER。
optional属性是定义该关联类是否必须存在,值为false时,关联类双方都必须存在,如果关系被维护端不存在,查询的结果为null。值为true 时,关系被维护端可以不存在,查询的结果仍然会返回关系维护端,在关系维护端中指向关系被维护端的属性为null。optional属性的默认值是true。optional属性实际上指定关联类与被关联类的join 查询关系,如optional=false 时join 查询关系为inner join,optional=true 时join 查询关系为left join。下面代码片断解释如下:
有一点需要强调:当业务方法需要把一个实体Bean作为参数返回给客户端时,除了实体Bean本身需要实现Serializable接口之外,如果关联类(OrderItem)是延迟加载,还需在返回实体Bean之前通过访问关联类的方式加载关联类(见下例)。否则在客户端访问关联类时将会抛出加载例外。
另外不管是否延迟加载,通过join fetch 关联语句都可显式加载关联类.
@JoinColumn:双向一对多关系,一是关系维护端(owner side),多是关系被维护端(inverseside)。在关系被维护端需要通过@JoinColumn建立外键列指向关系维护端的主键列。
@OrderBy(value = "id ASC") 指明加载OrderItem 时按id 的升序排序
------------------------------------------------------------------------------------------------------------

@AccessType("field")
AccessType.PROPERTY: The EJB persistence implementation will loadstate into your class via JavaBean "setter" methods, and retrievestate from your class using JavaBean "getter" methods. This is thedefault.
        -->通过getter和setter方法访问Entity的变量,可以把变量定义为private;
        --> 需要在getter方法上定义字段的属性;
AccessType.FIELD: State is loaded and retrieved directly from yourclass' fields. You do not have to write JavaBean "getters" and"setters".
      -->直接访问Entity的变量,可以不定义getter和setter方法,但是需要将变量定义为public;
      --> 需要在变量上定义字段的属性;

1、FetchType.LAZY:懒加载,加载一个实体时,定义懒加载的属性不会马上从数据库中加载。
2、FetchType.EAGER:急加载,加载一个实体时,定义急加载的属性会立即从数据库中加载。
3、比方User类有两个属性,name跟address,就像百度知道,登录后用户名是需要显示出来的,此属性用到的几率极大,要马上到数据库查,用急加载;而用户地址大多数情况下不需要显示出来,只有在查看用户资料是才需要显示,需要用了才查数据库,用懒加载就好了。所以,并不是一登录就把用户的所有资料都加载到对象中,于是有了这两种加载模式。

@Lob 注解属性将被持久化为 Blog 或 Clob 类型。具体的java.sql.Clob, Character[],char[] 

和 java.lang.String 将被持久化为 Clob类型. java.sql.Blob, Byte[], byte[] 和serializable type 将被持久化为 Blob 类型。

eg:@Lob
   @Basic(fetch=FetchType.LAZY)
    @Column(name= "LOG_DETAIL")



二、spring

--------------------------------------------------------------------------------------------------------
以下摘自: http://blog.163.com/www_jiangtao/blog/static/24915273201061992240217/
@Autowired,按照类型注入
@Resource,默认按照名称注入,如果名称没有指定,则按照类型注入,@Resource 的作用相当于 @Autowired,只不过@Autowired 按 byType 自动注入,面 @Resource 默认按 byName 自动注入罢了。@Resource有两个属性是比较重要的,分别是 name 和 type,Spring 将 @Resource 注释的 name 属性解析为 Bean的名字,而 type 属性则解析为 Bean 的类型。所以如果使用 name 属性,则使用 byName 的自动注入策略,而使用type 属性时则使用 byType 自动注入策略。如果既不指定 name 也不指定 type 属性,这时将通过反射机制使用byName 自动注入策略。
@PostConstruct 和 @PreDestroy,这两个注释只能应用于方法上。标注了 @PostConstruct注释的方法将在类实例化后调用,而标注了 @PreDestroy 的方法将在类销毁之前调用 ,我们知道,不管是通过实现InitializingBean/DisposableBean 接口,还是通过<bean> 元素的 init-method/destroy-method属性进行配置,都只能为 Bean 指定一个初始化 / 销毁的方法。但是使用 @PostConstruct 和 @PreDestroy注释却可以指定多个初始化 / 销毁方法,那些被标注 @PostConstruct 或 @PreDestroy 注释的方法都会在初始化/ 销毁时被执行,一般都指定一个,以免混乱.
<context:annotation-config/> onlylooks for annotations on beans in the same application context itis defined in. This means that, if you put<context:annotation-config/> in aWebApplicationContext for a DispatcherServlet, it only checks for@Autowired beans in your controllers, and not your services. See Section 13.2,“The DispatcherServlet” for more information.
@Component:定义bean,在使用 @Component 注释后,Spring 容器必须启用类扫描机制以启用注释驱动 Bean定义和注释驱动 Bean 自动注入的策略。Spring 2.5 对 context命名空间进行了扩展,提供了这一功能<context:component-scan  base-package = "com.xcg.dao,com.xcg.service"/>,当然xsd文件定义要引入。

@Around注解表明在切点方法的前后都要执行该处理器方法,那么切点在哪呢?切点就定义在了@Around后面的括号内也就是这个表达式:"execution (*org.y0ung.example.custom_annotation_with_spring.service.*.*(..))&& @annotation(young)&& args(key)"这个表达式的意思是说指向这些方法,在org.y0ung.example.custom_annotation_with_spring.service包中的,所有类的(第一个*),所有方法(第二个*),并且该方法有注解@annotation(young)括号中的young是表示这个会做为参数传入处理器方法,也就是下面方法的第二个参数。而且这个方法还有一个参数args(key),并且这个key也做为参数传入到处理器方法。而ProceedingJoinPointpjp参数是固有参数,你可以不加,但是要加一定要放到第一个位置。args(key)也可以不添加在@Around内,可以通过pjp.getArgs()方法获取传入参数。如果方法本来就有返回值,那么就要把上面的方法加上返回值Object,在方法中返回就可以了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值