EJB3 Mappings / onetomany / manytoone如何处理关系

时间:2012-11-26 08:14:15

标签: java database java-ee jpa ejb-3.0

我正在使用Java EE JSP / EJB3,我在实现表之间的关系时遇到了问题。最初我在考虑存储id,但我读过它会破坏存储对象引用的EJB的目的

作为解释我问题的一个测试例子,我想出了一个汽车模型和汽车品牌关系。在此Web应用程序中,用户首先创建品牌。然后创建汽车并从下拉列表中选择品牌。

Car - > rand:多对一 品牌 - >汽车:一对多

public class Brand implements Serializable {
  private static final long serialVersionUID = 1L;

  @Id
  @GeneratedValue(strategy=GenerationType.AUTO)
  @Column(name="id")
  private long id;

  @Column(name="brand_name")
  private String brand_name;

  @Column(name="cars_fk")
  private Set<Car> cars;
...

}

以下是汽车Entitybean

public class Car implements Serializable {
  private static final long serialVersionUID = 1L;

  @Id
  @GeneratedValue(strategy=GenerationType.AUTO)
  @Column(name="id")
  private long id;

  private Brand brand;

  @ManyToOne(fetch = FetchType.LAZY)
  @Column(name="brand_FK")
  private Brand brand;
...

}

鉴于以上是正确的(我不确定)

处理这些

输入的最佳做法是什么

让我说我有这个HTML(如果选择必须不同请告诉)

<form action="processCar.jsp">
  Model: <input type="text" name="title"><br>

  <select>
    <option value="volvo">Volvo</option>
    <option value="saab">Saab</option>
    <option value="mercedes">Mercedes</option>
    <option value="audi">Audi</option>
  </select> 

  <input type="submit" value="Submit">
</form> 

品牌选项从Brand.findAll加载。

此外,如果这是正确的,那么从品牌名称/ ID转换为实体对象品牌的位置是什么?在会话bean中?

public void createCar(String title,String brandname){
   Query query = em.createNamedQuery("Brand.getBrandbyName");
   query.setParameter("brand_name", brandname);
   Brand brand = (Brand)query.getSingleResult();
   carSLSBManagement.create(title,brand);
}

提前致谢

1 个答案:

答案 0 :(得分:0)

执行此操作的常用方法是使用ID作为下拉列表中的值,然后在接收请求的代码中尽快将其转换为对象。那将是一个servlet或等价物,而不是一个bean。 bean应该使用已经获取的对象。

如果您拥有品牌的ID,那么获取它就像下面这样简单:

long brandId = Long.parseLong(request.getParameter("brandId"));
Brand brand = em.find(Brand.class, brandId);

我将补充一点,虽然我的首选是在网络层中进行所有参数解析和解码,但在进入域层之前,由于技术原因,您可能会更方便地将其中的一部分向下推入域中层。例如,当您执行em.find时,您应该打开一个事务,如果您使用经典的Java EE体系结构与servlet和EJB,那么事务自然会从EJB开始,而servlet是非事务性的。为了适应这种情况,您可以将ID解析为servlet中的long,但是获取EJB中的对象。这有点笨拙,但它确实意味着你不必乱用交易。