(Hibernate 框架 二 )
一、Hibernate 注解开发时,一对多关系映射时发生了jar包冲突问题
(1)以客户和订单为例模拟问题出现的情景
一方:(客户)
@Entity
@Table(name="customers")
public class Customer {
@Id
//AUTO相当于 native
@GeneratedValue(strategy=GenerationType.AUTO)
private Integer id;
private String name;
//targetEntity 类似于<one-to-many class=""/> 要映射的对方的类
//mappedBy 作用相当于inverse="true" 在对方类中关联自己的属性
@OneToMany(targetEntity = Order.class,mappedBy="customer")
@Cascade(value={CascadeType.SAVE_UPDATE})
private Set<Order> orders = new HashSet<Order>();
......(提供setter和getter函数,这里省略)
}
多方:(客户)
@Entity
@Table(name="orders")
public class Order {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Integer id;
private String address;
@ManyToOne(targetEntity=Customer.class)
@JoinColumn(name="customer_id")
private Customer customer;
......(提供setter和getter函数,这里省略)
}
测试代码:
@Test
public void demo3(){
//1,开启Session
Session session =HibernateUtils.getSession();
Transaction transaction =session.beginTransaction();
//客户
Customer customer = new Customer();
customer.setName("小明");
//订单1
Order order1 = new Order();
order1.setAddress("杭州大厦");
//订单2
Order order2 =new Order();
order2.setAddress("北京三里屯");
//保存订单和客户
session.save(customer);
//建立关联关系
customer.getOrders().add(order1);
customer.getOrders().add(order2);
order1.setCustomer(customer);
order2.setCustomer(customer);
transaction.commit();
session.close();
}
运行后报错:
java.lang.NoSuchMethodError: javax.persistence.OneToMany.orphanRemoval()Z
(2)报错原因
使用hibernate annotations(注解开发)的@OneToMany 一对多双向关联后出现异常,出现这种异常通常是由于Myeclipse的javaee.jar 版本较低,与Hibernate等自带的JPA出现了冲突。
简而言之, Hibernate 3.6.10 与 javaee.jar 包(上图javaee.jar)的中的一些类库产生冲突造成的。(而这里是persistence 文件夹发生了冲突,下面会提到)
二、解决方法
(1)在MyEclipse的安装路径下找到这个jar包:
D:\Java\myeclipse\Myeclipse\Common\plugins\com.genuitec.eclipse.j2eedt.core_10.5.0.me201207171805\data\libraryset\EE_5\javaee.jar
如下:
(2)把Javaee.jar复制出来,用压缩包格式打开
在 javax 中找到 persistence 文件夹,并删除即可
(3)把修改后的 Javaee.jar 放到原位置,重新打开MyEclipse,运行正确
注:为了方便先把为修改的jar包备份一下,以防以后会用到