1

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

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

Car ->rand:多对一 Brand->Car:一对多

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 到实体对象 Brand 的转换是在哪里完成的?在会话 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);
}

提前致谢

4

1 回答 1

0

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

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

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

我要补充一点,虽然我的偏好是在 web 层中完成所有参数的解析和解码,但在进入领域层之前,出于技术原因,可能更方便您将其中的一些向下推入领域层。例如,您应该在执行 时打开一个事务em.find,并且如果您使用带有 servlet 和 EJB 的经典 Java EE 架构,那么事务自然会从 EJB 开始,而 servlet 是非事务性的。为了适应这种情况,您可以在 servlet 中将 ID 解析为 long,但在 EJB 中获取对象。这有点笨拙,但这确实意味着你不必搞乱交易。

于 2012-11-26T08:30:45.117 回答