hibernate注解实例【整理】

@OneToOne

t_card (  `cardId`,  `cardNumber`) 

t_person(  `personId`,  `personName` ,  `cid`)

 

public class Person {   

 private Card    card;

/**    

* @OneToOne:一对一关联     

 * cascade:级联,它可以有有五个值可选,分别是:     

* CascadeType.PERSIST:级联新建     

 * CascadeType.REMOVE : 级联删除     

 * CascadeType.REFRESH:级联刷新     

 * CascadeType.MERGE  : 级联更新     

* CascadeType.ALL    : 以上全部四项     

* @JoinColumn:主表外键字段     

* cid:Person所映射的表中的一个字段     

 */

@OneToOne(cascade = CascadeType.ALL)    @JoinColumn(name= "cid")   

public Card getCard() {       

 return card;   

}

public class Card {    

  private Person  person;

/**    

* @OneToOne:一对一关联      * mappedBy = "card":意思是说这里的一对一配置参考了card    

* card又是什么呢?card是Person类中的getCard(),注意不是Person类中的card属性,Person类中的OneToOne配置就是在getCard()方法上面配的.    

 * 如果Person类中的getCard()方法改成getIdCard(),其他不变的话, 这里就要写成:mappedBy = "idCard"

  */   

@OneToOne(mappedBy = "card")   

 public Person getPerson() {       

 return person;   

 }

 

你可以对 Collection ,List (指有序列表, 而不是索引列表), Map和Set这几种类型进行映射.
EJB3规范定义了怎么样使用@javax.persistence.OrderBy 注解来对有序列表进行映射:
该注解接受的参数格式:用逗号隔开的(目标实体)属性名及排序指令, 如firstname asc, age desc,如果该参数为空,则默认以id对该集合进行排序.
如果某个集合在数据库中对应一个关联表(association table)的话,你不能在这个集合属性上面使用@OrderBy注解.
对于这种情况的处理方法,请参考Hibernate Annotation Extensions. EJB3 允许你利用目标实体的一个属性作为Map的key,
这个属性可以用@MapKey(name="myProperty")来声明.
如果使用@MapKey注解的时候不提供属性名, 系统默认使用目标实体的主键.
map的key使用和属性相同的列:不需要为map key定义专用的列,因为map key实际上就表达了一个目标属性。
注意一旦加载,key不再和属性保持同步, 也就是说,如果你改变了该属性的值,在你的Java模型中的key不会自动更新 (请参考Hibernate Annotation Extensions).
很多人被<map>和@MapKey弄糊涂了。 其他它们有两点区别.@MapKey目前还有一些限制,详情请查看论坛或者 我们的JIRA缺陷系统。
注意一旦加载,key不再和属性保持同步, 也就是说,如果你改变了该属性的值,在你的Java模型中的key不会自动更新.
(Hibernate 3中Map支持的方式在当前的发布版中还未得到支持).


@Entity public class City {

    @OneToMany(mappedBy="city")
    @OrderBy("streetName")
    public List<Street> getStreets() {
        return streets;
    }
    ...
}

@Entity public class Street {
    public String getStreetName() {
        return streetName;
    }

    @ManyToOne
    public City getCity() {
        return city;
    }
    ...
}


@Entity
public class Software {

    @OneToMany(mappedBy="software")
    @MapKey(name="codeName")
    public Map<String, Version> getVersions() {
        return versions;
    }
...
}

@Entity
@Table(name="tbl_version")
public class Version {

    public String getCodeName() {...}

    @ManyToOne
    public Software getSoftware() { ... }
...
}

上面这个例子中,City 中包括了以streetName排序的Street的集合. 而Software中包括了以codeName作为 key和以Version作为值的Map.
 
除非集合为generic类型,否则你需要指定targetEntity. 这个注解属性接受的参数为目标实体的class.


@Entity
@Table(name="members")
public class Member
{
 ...

 @ElementCollection(targetClass=String.class)
 @JoinTable(name="member_attributes", joinColumns=@JoinColumn(name="members"))
 private Map<String, String> attributes;//会员属性

 ...
}

这样的话:数据库表member_attributes有三列: members、key,value
操作的话类似的
 member.getAttributes().put("mobile", "16888888888");
 member.getAttributes().remove("mobile");


public class Group {
  private int id;
  private String name;
  private Map<Integer,User> users = new HashMap<Integer,User>();

  @OneToMany(mappedBy = "group", cascade = { CascadeType.ALL })
  @MapKey(name="id")
  public Map<Integer, User> getUsers() {
   return users;
  }

}

public class User {
  private int id;
  private String name;
  private Group group;
 
 @ManyToOne(cascade = CascadeType.ALL)
  /*@ManyToOne就是要生成一个外键去关联它的关联类
   * 如果没有下面这个注解也会将在User实体对应的数据表中产生一个外键字段,它是参照Group的主键*/
  @JoinColumn(name="groupid")
  public Group getGroup() {
   return group;
  }

}

Group group=new Group();
group.getUsers().put(user.getId(), user);
group.getUsers().put(user1.getId(), user1);


Article {

 @OneToMany(fetch = FetchType.EAGER, cascade=CascadeType.ALL)
 @JoinColumn(name="embed_id", referencedColumnName="id")
 @MapKeyColumn(name = "language")
 @MapKeyEnumerated(EnumType.ORDINAL)
 private Map<Language, Locale> locales;

 Article() {
  locales.put(Language.CS, new Locale());
  locales.put(Language.EN, new Locale());
 }

}

Locale {

 @Id
 private Language language;

 @Column(length = 256)
 private String name;

}

以上内容摘录自其它博客,在此谢过各位

http://blog.csdn.net/wangpeng047/article/details/8744063
http://blog.csdn.net/skewen/article/details/6493668
http://blog.sina.com.cn/s/blog_638ea2c50100u47v.html
http://codego.net/437785/

http://www.cnblogs.com/fancyzero/archive/2012/06/10/hibernate-one-to-one-annotation.html

http://blog.csdn.net/wangpeng047/article/details/8744063

http://blog.csdn.net/wangpeng047/article/details/8712752

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值