Java 关于使用jpa注释映射以下与ebean的关系的指南

Java 关于使用jpa注释映射以下与ebean的关系的指南,java,jpa,ebean,Java,Jpa,Ebean,我在DB中有以下两个实体(结构是固定的),我正在尝试使用JPA注释映射它们,而EBEAN是ORM 我有以下几种豆子: class Item { public Long id; public String name; public Consignee intermediate; public Consignee ultimate; } class Consignee { public Long id; public String name; public

我在DB中有以下两个实体(结构是固定的),我正在尝试使用JPA注释映射它们,而EBEAN是ORM

我有以下几种豆子:

class Item {
   public Long id;
   public String name;
   public Consignee intermediate;
   public Consignee ultimate;
}

class Consignee {
   public Long id;
   public String name;
   public String address;
   public Item item;
}
以及相应的表格:

Item
----
id
name

Consignee
---------
id:
name
address
item_id
type: [1,2] / 1: intermediate, 2:ultimate
主实体是ITEM,尽管关系是从收货人端映射的

我如何使用注释映射它,以便在从DB获取Item对象时加载收货人(最终、中间)


您能告诉我正确的方向吗?

您试图映射到Ebean的两个表称为实体模型,实体收货人与商品之间的关系是一对多关系

这种关系可以在收货人端映射为
@OneToMany
注释,在商品端映射为
@ManyToOne

此外,收货人的字段类型可以映射为一个持久化为整数的枚举,其余字段可以通过
@Column
注释映射

您的需求的可能实现可能是:

public enum CONSIGNEE_TYPE {
      INTERMEDIATE,
      ULTIMATE
}

@Entity
@Table(name = "Consignee")
public class Consignee extends Model {
   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   public Long id;

   public String name;

   public String address;

   @Enumerated(EnumType.ORDINAL)
   public CONSIGNEE_TYPE type;

   @Column(name="item_id")
   @OneToMany(cascade = CascadeType.ALL, mappedBy = "consignee", fetch = FetchType.EAGER)
   public List<Item> item = new ArrayList<Item>();

   //TODO: Generate Constructors/Getters/Setters
}

@Entity
@Table(name = "Item")
public class Item extends Model {
   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   public Long id;

   public String name;

   @ManyToOne(optional = false, fetch = FetchType.EAGER)
   public Consignee consignee = new Consignee();

   //TODO: Generate Constructors/Getters/Setters
}
公共枚举类型{
中间的
终极的
}
@实体
@表(name=“收货人”)
公共类模型{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
公共长id;
公共字符串名称;
公共字符串地址;
@枚举(EnumType.ORDINAL)
公共收货人类型;
@列(name=“item\u id”)
@OneToMany(cascade=CascadeType.ALL,mappedBy=“收货人”,fetch=FetchType.EAGER)
public List item=new ArrayList();
//TODO:生成构造函数/获取器/设置器
}
@实体
@表(name=“Item”)
公共类项扩展模型{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
公共长id;
公共字符串名称;
@ManyToOne(可选=false,fetch=FetchType.EAGER)
公共收货人=新收货人();
//TODO:生成构造函数/获取器/设置器
}
我从类项中删除了与最终和中间收货人类型的歧义,因为您可以将收货人类型存储在收货人本身上

希望这有帮助


作为未来非常好的资源,我建议您阅读Ebean本身源代码中的单元测试。这并不漂亮,但对我帮助很大

谢谢你花时间写这么好的答案!阅读单元测试是个好主意,我现在就做。再次感谢!另外,对我来说,额外的复杂性如下。每个委托人可以有1..n个最终和中间委托人。@Istvano您需要一个n对n的关联。也就是说,您将需要创建一个包含收货人源和目标(收货人类型的字段)的类。然后在“收货人”上,您需要属性“收货人协会”(1-N)和“关联”(N-1)。关联类将具有源的多重性(1-N)和目标的多重性(1-N)。但是关于Eben的N-N是一个新的不同的话题,因为关于它有很多话要说:)。