1

我在我EJB喜欢的包装器中创建了entities. 在这个包装器中,我有我的业务逻辑和我的验证公用entity。我想知道如何将我的包装器发送到CRUD(但我不希望我的包装器成为@Entity)。

任何的想法???

4

1 回答 1

1

最好不要将您的 EJB 用作包装器,而是使用其他具有特定目的的 java 类来包装实体。

包装类应该包装一个实体,因此它应该是一对一的关联(不要与 jpa 混淆,我的意思是 java 关联/组合)。所以基本上你遵循装饰器模式。

然后,您创建所需的所有方法,这对于拥有与您要包装的实体相同的方法非常有帮助。然后在方法主体中调用您要包装的实体实例的相应方法。

例如

@Entity
public class Person {

    @Column(name = "ID")
    private Long id;
    @Column(name = "FIRST_NAME")
    private String firstName;
    @Column(name = "LAST_NAME")
    private String lastName;

    public String getFirstName(){
      return this.firstName;
    }

    public void setFirstName(String firstName){
      this.firstName = firstName;
    }

    public String getLastName(){
      return this.lastName;
    }

    public void setLastName(String lastName){
     this.lastName = lastName;
    }
}

public class PersonWrapper{
  private Person person;
  private String someCalculatedField;
  public PersonWrapper(Person person){
    this.person = person;
  }

  public Person getPerson(){
    return this.person;
  }

  public void setPerson(Person person){
    this.person = person;
  }

  public String getFirstName(){
    /* possibly do transformations */
    return person.getFirstName();
  }

  public void setFirstName(String firstName){
    /* possibly do validations, transformations*/
    person.setFirstName(firstName);
  }

  public String getSomeCalculatedField(){
  /*do stuff with person or other entities as well and populate the calculated field,
    then return it
  */
    return this.someCalculatedField;
  }


}

也许不清楚,但是在您完成 CRUD 函数或对包装器实例的任何其他操作之后,为了通过 jpa 持久保存您的更改,您需要检索 jpa 实体(即person在您的情况下从包装器的方法getPerson())并调用persistmergeremove或该实例的任何内容。

编辑

根据评论,我想明确表示,使包装器从实体继承只会有利于将非 jpa (例如 CRUD UI )代码与包装器本身分离,例如通过调用 Person person = new PersonWrapper(personEntity);而不是PersonWrapper person = new PersonWrapper(personEntity);.

即使在继承之后,也必须重写包装器中的方法,因为包装器的方法体调用包装实例上的代码而不是包装器本身。不覆盖这些方法将调用包装器本身的继承方法。后者是一个错误,原因有两个,

1.从错误的实例中存储/检索数据(包装器不是包装的实体)

2.数据不应该存储在包装器中,因为它不能在jpa函数中使用,因为它不是实体(那里没有jpa继承),只能使用包装的实例。此外,包装器并非来自托管 jpa 上下文,因此它没有与持久性相关的数据。

于 2013-11-14T08:41:39.527 回答