Jakarta ee 如何在EJB3中的实体中存储复杂对象?
我正在从事一个基于EJB3的DVD商店项目。 通过此项目,客户可以选择DVD并将DVD放入购物车,然后购物车将创建预订记录。 我的问题是,我希望保留是一个实体(数据库中的一个表),但它有一个属性ShoppingCart,这是一个复杂的对象;实体不支持复杂对象的存储,我不知道如何处理这个问题? 有谁能给我一些建议或更好的解决方案吗 这是课程:Jakarta ee 如何在EJB3中的实体中存储复杂对象?,jakarta-ee,properties,entity,ejb-3.0,Jakarta Ee,Properties,Entity,Ejb 3.0,我正在从事一个基于EJB3的DVD商店项目。 通过此项目,客户可以选择DVD并将DVD放入购物车,然后购物车将创建预订记录。 我的问题是,我希望保留是一个实体(数据库中的一个表),但它有一个属性ShoppingCart,这是一个复杂的对象;实体不支持复杂对象的存储,我不知道如何处理这个问题? 有谁能给我一些建议或更好的解决方案吗 这是课程: public class ShoppingCartItem { private DVD item; private int
public class ShoppingCartItem {
private DVD item;
private int quantity;
…
}
public class ShoppingCart {
private HashMap<String, ShoppingCartItem> items;
private int numberOfItems;
…
}
@Entity
public class DVD implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String title;
…
}
@Entity
public class Reservation implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
//the problem is here
private ShoppingCart cart;
…
}
公共类ShoppingCartItem{
私人DVD项目;
私人整数数量;
…
}
公共类购物车{
私有HashMap项;
私人物品;
…
}
@实体
公共类DVD实现可序列化{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
私人长id;
私有字符串标题;
…
}
@实体
公共类保留实现了可序列化{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
私人长id;
//问题就在这里
私人购物车;
…
}
您应该定义您感兴趣保留的购物车的哪些信息
在JPA实体(您称之为“EJB3中的实体”)中,可以存储:
- 简单字段(字符串、整数等)
- Embeddebles(存储在DB中但没有持久标识的对象,换句话说,没有“id”)
- 与其他实体的关系
- 任何可序列化的对象
您的案例似乎可以使用第三个或第四个选项解决
存储可序列化对象
如果只想持久化整个对象,则应将implements Serializable
添加到ShoppingCar
中,并将其正确持久化到数据库中。
但是,它将使用Java序列化进行持久化(因此它将是持久化期间传递的对象的二进制表示)。这是实现你目标的一种非常罕见的方式
使用实体关系
你有没有考虑过<代码>购物车> /代码>实体?这样,您可以在保存
Reservation
对象时使用关系并持久化整个对象,即:
@Entity
public class Reservation implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@OneToOne
private ShoppingCart cart;
// ...
}
上面的示例假设正好有一个预订
将连接到正好一个购物车
实现目标的另一种方法是扩展预订
实体并为订购的产品添加字段,即:
@Entity
public class Reservation implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@ElementCollection
private Map<DVD, Integer> items;
}
@实体
公共类保留实现了可序列化{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
私人长id;
@元素集合
私人地图项目;
}
注意使用Map
作为接口,而不是HashMap
,这是首选(如果JPA不需要的话)。还要注意,在一个结构中,您可以同时保存项目和用户购买的数量
请记住,在本例中,DVD
应该是一个实体(这很合理,因为您可能会将所有项目存储在数据库中)。您应该定义您希望持久保存的购物车的哪些信息
在JPA实体(您称之为“EJB3中的实体”)中,可以存储:
- 简单字段(字符串、整数等)
- Embeddebles(存储在DB中但没有持久标识的对象,换句话说,没有“id”)
- 与其他实体的关系
- 任何可序列化的对象
您的案例似乎可以使用第三个或第四个选项解决
存储可序列化对象
如果只想持久化整个对象,则应将implements Serializable
添加到ShoppingCar
中,并将其正确持久化到数据库中。
但是,它将使用Java序列化进行持久化(因此它将是持久化期间传递的对象的二进制表示)。这是实现你目标的一种非常罕见的方式
使用实体关系
你有没有考虑过<代码>购物车> /代码>实体?这样,您可以在保存
Reservation
对象时使用关系并持久化整个对象,即:
@Entity
public class Reservation implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@OneToOne
private ShoppingCart cart;
// ...
}
上面的示例假设正好有一个预订
将连接到正好一个购物车
实现目标的另一种方法是扩展预订
实体并为订购的产品添加字段,即:
@Entity
public class Reservation implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@ElementCollection
private Map<DVD, Integer> items;
}
@实体
公共类保留实现了可序列化{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
私人长id;
@元素集合
私人地图项目;
}
注意使用Map
作为接口,而不是HashMap
,这是首选(如果JPA不需要的话)。还要注意,在一个结构中,您可以同时保存项目和用户购买的数量
请记住,在本例中,DVD
应该是一个实体(这很合理,因为您可能会将所有项目存储在数据库中)。我确实不知道如何接受一个好的答案,但现在我知道了。谢谢您提醒我!的确,我不知道如何接受一个好的答案,但现在我知道了。谢谢你提醒我!你的答案很清楚!非常感谢你!对于实体ShoppingCart,我更喜欢第三种解决方案:`@Entity公共类ShoppingCart实现可序列化的{@Id@GeneratedValue(strategy=GenerationType.AUTO)}@ElementCollection//是否必要?