我正在使用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);
}
提前致谢
答案 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中的对象。这有点笨拙,但它确实意味着你不必乱用交易。