@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