@Entity(name="person") 映射实体
@Id 声明为主键
@GeneratedValue 主键自增的生成方式,默认为根据方言生成,里面有个generator是指定上面序列生成器的名字,一般不指定
@Temporal(TemporalType.DATE) 主要针对Date类型的字段可以指定相对应的日期类型
一对一外键映射: @OneToOne(cascade=CascadeType.ALL)
@JoinColumn(name="per_id",unique=true,nullable=false)
一对一共享主键映射:
@Id @GenericGenerator(name = "foreigner", strategy = "foreign",parameters={@Parameter(name="property",value="person")}) @GeneratedValue(generator="foreigner") public int getId() { return id; } public void setId(int id) { this.id = id; } @OneToOne(cascade=CascadeType.ALL) @PrimaryKeyJoinColumn public Person getPerson() { return person; } public void setPerson(Person person) { this.person = person; }
因为JPA里面没有对共享主键做很好的实现,所以需要借助Hibernate里面的配置进行设置,
先声明一个GenercGenerator主键生成器,定义为foreign,引用一个主的对象,然后在GeneratedValue里面指定
刚声明的主键生成器,这样就OK了,虽然在数据库里面看不出表有什么区别,但在用jpa语法插入数据时就只能通过对象
引用主键id来插入了,自己指定的是无效的
一对多双向映射:@OneToMany 属性:mappedBy用于指定谁是关系维护端(多的一方为关系维护端,关系维护端负责外键记录的更新,关系被维护端没有权力更新外键),fetch:指定立即加载或者延迟加载,optional用于声明这个引用外键的值是可有(false)或可无(true)的
@Entity(name="person") public class Person implements Serializable { private int id; private String name; private int age; private Date birthday; private IdCard idCard; @ManyToOne(cascade=CascadeType.ALL) @JoinColumn(name="c_id") public IdCard getIdCard() { return idCard; } public void setIdCard(IdCard idCard) { this.idCard = idCard; } @OneToMany(cascade=CascadeType.ALL,mappedBy="idCard") public Set<Person> getPersons() { return persons; } public void setPersons(Set<Person> persons) { this.persons = persons; } //此方法用于向外键添加值 public void addPersons(Person person){ person.setIdCard(this); persons.add(person); System.out.println(persons.size()); }
多对多双向映射:@JoinTable是关联的表,inverseJoinColumns是被关联表引用的字段,joinColumns是关联表引用的字段
@ManyToMany(cascade=CascadeType.ALL) @JoinTable(name="p_card" ,inverseJoinColumns={@JoinColumn(name="t_id")},joinColumns=@JoinColumn(name="p_id")) public Set<IdCard> getIdCards() { return idCards; }