您的位置:首页 > 其它

JPA-映射单向一对多的关联关系

2018-01-26 21:06 393 查看
用customer表去生成外键,即用1的一端生成外键

@Table(name="customers")
@Entity
public class Customer {

private Integer id;
private String lastname;
private Integer age;
private Set<Order> orders=new HashSet<Order>();

@GeneratedValue(strategy=GenerationType.AUTO)//也可以不写,默认就是自增策略
@Id //strategy:战略,策略 generator:生成,生产
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getLastname() {
return lastname;
}
public void setLastname(String lastname) {
this.lastname = lastname;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}

//映射单向1-n的关联关系
//使用@OneToMany来映射1-n的关联关系
//使用@JoinColumn来映射外键列的名称
//可以使用@OneToMany(fetch=FetchType.EAGER)来修改默认的加载策略
//可以使用@OneToMany(cascade={CascadeType.REMOVE})来进行级联删除
@OneToMany(fetch=FetchType.EAGER,cascade={CascadeType.REMOVE})
@JoinColumn(name="customer_id")
public Set<Order> getOrders() {
return orders;
}
public void setOrders(Set<Order> orders) {
this.orders = orders;
}
@Override
public String toString() {
return "Customer [id=" + id + ", lastname=" + lastname + ", age=" + age
+ ", orders=" + orders + "]";
}
}


OneToMany的CRUD
public class JPATest {

private EntityManager entityManager;
private EntityTransaction transaction;
private EntityManagerFactory entityManagerFactory;

@Before
public void setUp() throws Exception {
entityManagerFactory = Persistence.createEntityManagerFactory("jpa-1");
entityManager = entityManagerFactory.createEntityManager();
transaction = entityManager.getTransaction();
transaction.begin();
}

@After
public void destroy() {
transaction.commit();
entityManager.close();
entityManagerFactory.close();
}

@Test
public void testOneToManyUpdate(){
Customer customer = entityManager.find(Customer.class, 1);
customer.getOrders().iterator().next().setOrdername("NB");
}

//默认情况下,若删除1的一端,则会先把关联的n的一端的外键置空,再进行删除
//可以使用@OneToMany(cascade={CascadeType.REMOVE})来进行级联删除
@Test
public void testOneToManyRemove(){
// Customer customer = entityManager.find(Customer.class, 1);
// entityManager.remove(customer);
Order order = entityManager.find(Order.class, 3);
entityManager.remove(order);
}

//默认对关联的多的一方使用懒加载策略
//可以使用@OneToMany(fetch=FetchType.EAGER)来修改默认的加载策略
@Test
public void testOneToManyFind(){
Customer customer = entityManager.find(Customer.class, 1);
System.out.println(customer.getLastname());
System.out.println(customer.getOrders().size());
}

//单向1-n关联关系执行保存时,一定会多出update语句,
//因为n的一端在插入时不会同时插入外键列
@Test
public void testOneToManyPersist(){
Customer customer = new Customer();
customer.setAge(12);
customer.setLastname("jiangli");

Order o1=new Order();
o1.setOrdername("AAA");
Order o2=new Order();
o2.setOrdername("BBB");

//建立关联关系
customer.getOrders().add(o1);
customer.getOrders().add(o2);
//执行保存操作
entityManager.persist(customer);
entityManager.persist(o1);
entityManager.persist(o2);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: