我在我EJB
喜欢的包装器中创建了entities
. 在这个包装器中,我有我的业务逻辑和我的验证公用entity
。我想知道如何将我的包装器发送到CRUD(但我不希望我的包装器成为@Entity
)。
任何的想法???
我在我EJB
喜欢的包装器中创建了entities
. 在这个包装器中,我有我的业务逻辑和我的验证公用entity
。我想知道如何将我的包装器发送到CRUD(但我不希望我的包装器成为@Entity
)。
任何的想法???
最好不要将您的 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()
)并调用persist
,merge
,remove
或该实例的任何内容。
编辑
根据评论,我想明确表示,使包装器从实体继承只会有利于将非 jpa (例如 CRUD UI )代码与包装器本身分离,例如通过调用 Person person = new PersonWrapper(personEntity);
而不是PersonWrapper person = new PersonWrapper(personEntity);
.
即使在继承之后,也必须重写包装器中的方法,因为包装器的方法体调用包装实例上的代码而不是包装器本身。不覆盖这些方法将调用包装器本身的继承方法。后者是一个错误,原因有两个,
1.从错误的实例中存储/检索数据(包装器不是包装的实体)
2.数据不应该存储在包装器中,因为它不能在jpa函数中使用,因为它不是实体(那里没有jpa继承),只能使用包装的实例。此外,包装器并非来自托管 jpa 上下文,因此它没有与持久性相关的数据。