注解 关联映射

本文详细介绍了在ORM中一对多、多对一及双向关联的实现方式,并展示了如何通过@Column注解进行属性映射,以及如何执行本地化查询和HQL查询。

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

一、一对多

@Id private Integer deptno; @Column(name="dname") private String dname; @Column(name="loc") private String loc; @OneToMany(cascade={CascadeType.ALL},targetEntity=Emp.class) @JoinColumn(name="deptno",updatable=false) private Set emps = new HashSet(); @Column(name="deptno") private Integer dept; @Column(name = "ename") private String ename; @Column(name = "job") private String job; @Column(name = "mgr") private Short mgr; @Column(name = "hiredate") private Date hiredate; @Column(name = "sal") private Double sal; @Column(name = "comm") private Double comm; @Version @Column(name = "version") private Integer version;
二、多对一

@Id @GeneratedValue(generator = "emp", strategy = GenerationType.SEQUENCE) @SequenceGenerator(name="emp",sequenceName="emp_seq",allocationSize=1) private Integer empno; @ManyToOne(targetEntity=Dept.class) @JoinColumn(name = "deptno", updatable = false) @Basic(fetch = FetchType.LAZY) /* @Basic注解可以声明属性的获取策略(fetch strategy) */ private Dept dept; @Column(name = "ename") private String ename; @Column(name = "job") private String job; @Column(name = "mgr") private Short mgr; @Column(name = "hiredate") private Date hiredate; @Column(name = "sal") private Double sal; @Column(name = "comm") private Double comm; @Version @Column(name = "version") private Integer version;
@Id private Integer deptno; @Column(name="dname") private String dname; @Column(name="loc") private String loc;
三、多对一、一对多双向

@Id private Integer deptno; @Column(name="dname") private String dname; @Column(name="loc") private String loc; @OneToMany(cascade={CascadeType.ALL},targetEntity=Emp.class) @JoinColumn(name="deptno",updatable=false) private Set emps = new HashSet();
@Id @GeneratedValue(generator = "emp", strategy = GenerationType.SEQUENCE) @SequenceGenerator(name="emp",sequenceName="emp_seq",allocationSize=1) private Integer empno; @ManyToOne(targetEntity=Dept.class) @JoinColumn(name = "deptno", updatable = false) @Basic(fetch = FetchType.LAZY) /* @Basic注解可以声明属性的获取策略(fetch strategy) */ private Dept dept; @Column(name = "ename") private String ename; @Column(name = "job") private String job; @Column(name = "mgr") private Short mgr; @Column(name = "hiredate") private Date hiredate; @Column(name = "sal") private Double sal; @Column(name = "comm") private Double comm; @Version @Column(name = "version") private Integer version;

注:当属性名和数据库字段名不一致时,要显示指定@Column

使用 @Column 注解可将属性映射到列. 使用该注解来覆盖默认值(关于默认值请参考EJB3规范). 在属性级使用该注解的方式如下:

①不进行注解

②和 @Basic一起使用

③和 @Version一起使用

④和 @Lob一起使用

⑤和 @Temporal一起使用

⑥和 @org.hibernate.annotations.CollectionOfElements一起使用 (只针对Hibernate )



四、本地化查询

@NamedNativeQuery(name="dept&emp",query="select d.*,e.* from dept d,emp e where e.deptno=d.deptno",resultSetMapping="joinMapping") @SqlResultSetMapping(name="joinMapping",entities={ @EntityResult(entityClass=Dept.class), @EntityResult(entityClass=Emp.class) } )

List<Object[]> l=sess.getNamedQuery("dept&emp").list(); for (Object[] objects : l) { Dept d=(Dept)objects[0]; Emp e=(Emp)objects[1]; System.out.println(d.getDname()+" "+e.getEname()); }


五、HQL查询

@NamedQuery(name = "sqlquery", query = "select e from Emp e where e.dept.deptno = :dno")sess.getNamedQuery("sqlquery").setInteger("dno", 10).list().size()







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值