Jakarta ee 如何在EJB3中的实体中存储复杂对象?

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

我正在从事一个基于EJB3的DVD商店项目。 通过此项目,客户可以选择DVD并将DVD放入购物车,然后购物车将创建预订记录。 我的问题是,我希望保留是一个实体(数据库中的一个表),但它有一个属性ShoppingCart,这是一个复杂的对象;实体不支持复杂对象的存储,我不知道如何处理这个问题? 有谁能给我一些建议或更好的解决方案吗 这是课程:

    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//是否必要?