标签:for rem hibernate 删除 hashset iss ref val 信息
这一节,我们看看hibernate关联关系的增删改查
就关联关系而已,咱们在上一节已经提了非常多了,一对多,多对一,单向,双向...
事实上咱们能够简单的说就是A与B,有关系。
至于他们究竟是一对多,多对一,暂且不论。
咱们要讨论的是,假设我存储A,那么数据库里是否会有B;假设我删除A,那么与之相关的B是否也会删除;假设我更新了A,那么B是否会被更新;假设我查询出A,那么B是否也会被查询出来。
首先,咱们看一对多,多对一双向的样例。
还是我们上一节的样例,dream与person。
一个person有多个dream,而每个dream仅仅能属于一个person。
我们在配置xml时,让hibernate自己主动生成建表语句,而且每次都新生数据库。
<property name="hbm2ddl.auto">create</property>实体类情况
@Entity
public class Person {
private int id;
private String name;
private Set<Dream> dreams=new HashSet<>();
@Id
@GeneratedValue
public int getId() {
return id;
}
@Column(name ="myname")
public String getName() {
return name;
}
@OneToMany(mappedBy="person")
public Set<Dream> getDreams() {
return dreams;
}//省略部分代码
}
@Entity
public class Dream {
private int id;
private String description;
private Person person;
@Id
@GeneratedValue
public int getId() {
return id;
}
@ManyToOne
@JoinColumn(name="personId")
public Person getPerson() {
return person;
} //省略部分代码
}
假设我们的測试代码例如以下:
//代码片1
public static void main(String[] args) {
Person p=new Person();
p.setName("dlf");
Dream d=new Dream();
d.setDescription("marry glt");
d.setPerson(p);
SessionFactory sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
session.save(p);
session.save(d);
session.getTransaction().commit();
}//代码片2
public static void main(String[] args) {
Dream d=new Dream();
d.setDescription("marry glt");
Person p=new Person();
p.setName("dlf");
p.getDreams().add(d);
SessionFactory sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
session.save(p);
session.getTransaction().commit();
}假设,我以"一"的那一方为主,上面的代码会是个什么情况?
我们看api文档
all的意思是,对这个对象的增删改四中操作都会影响到与之关联的那个对象。
(关于查询的级联,由还有一个属性管理)
persist的意思是,对这个对象的添加(save操作)会连带把与之关联的那个对象也sava了。
remove的意思就是,假设删除这个对象也会删除与之关联的那个对象。
OK看以下的修改
@ManyToOne(cascade={CascadeType.ALL})
@JoinColumn(name="personId")
public Person getPerson() {
return person;
}此时,我们以下的代码,就能正常执行了,并且数据库里,两个对象都存储了,且外键关联也是OK的。
//代码片3
Person p=new Person();
p.setName("dlf");
Dream d=new Dream();
d.setDescription("marry glt");
d.setPerson(p);
session.save(d);
@OneToMany(mappedBy="person",cascade={CascadeType.ALL})
public Set<Dream> getDreams() {
return dreams;
}
測试代码:
Dream d=new Dream();
d.setDescription("marry glt");
Person p=new Person();
p.setName("dlf");
p.getDreams().add(d);
session.save(p);
谈点规律:
1 我们发现假设存储对象的时候,我们从多的一方操作是比較简单的。所以以后,尽量在多的一方操作。
2 为了符合逻辑,同一时候也不出错,一点两个对象之间的关系是双向的,那么在代码层次,就把两个的引用都设好,这样就不会出问题了。
3 之前说的,假设是双向的,设定mappedby。
标签:for rem hibernate 删除 hashset iss ref val 信息
原文地址:http://www.cnblogs.com/ljbguanli/p/6791195.html