由于附加的方便方法,JPA和JavaSE表不是为实体类创建的
我目前正在编写一个用于持久性的Netbeans平台应用程序,我使用JPA2.1和eclipse链接作为提供程序。我有以下实体类:由于附加的方便方法,JPA和JavaSE表不是为实体类创建的,java,jpa,eclipselink,Java,Jpa,Eclipselink,我目前正在编写一个用于持久性的Netbeans平台应用程序,我使用JPA2.1和eclipse链接作为提供程序。我有以下实体类: import java.util.UUID; import javafx.beans.property.SimpleStringProperty; import javax.persistence.Access; import javax.persistence.AccessType; import javax.persistence.Entity; import j
import java.util.UUID;
import javafx.beans.property.SimpleStringProperty;
import javax.persistence.Access;
import javax.persistence.AccessType;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.Transient;
/**
*
* @author forell
*/
@Entity
@Access(AccessType.FIELD)
public class MaterialAbc {
@Id
private String id;
//... several additional fields, that all work fine
private String substanceInstances = "";
public MaterialAbc(){
id = UUID.randomUUID().toString();
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
//.. getters and setters for the omitted fields
public String getSubstanceInstances() {
return substanceInstances;
}
public void setSubstanceInstances(String substanceInstances) {
this.substanceInstances = substanceInstances;
}
/* IF I UNCOMMENT THESE LINES THE DATATABLE IS NOT CREATED ANYMORE
IS THERE A WAY TO SOLVE THIS?
public List<SubstanceInstance2> getSubs() {
List<SubstanceInstance2> subs = new ArrayList<>();
if (!"".equals(substanceInstances)){
List<String> values = Arrays.asList(substanceInstances.split("|"));
values.forEach(value->{
subs.add(SubstanceInstance2.unSerialize(value));
});
}
return subs;
}
public void setSubs(List<SubstanceInstance2> subs) {
substanceInstances = "";
subs.forEach(sub->{
substanceInstances =substanceInstances + sub.serialize() + "|";
});
substanceInstances = substanceInstances.substring(0, substanceInstances.length()-1);
}
*/
import java.util.UUID;
导入javafx.beans.property.SimpleStringProperty;
导入javax.persistence.Access;
导入javax.persistence.AccessType;
导入javax.persistence.Entity;
导入javax.persistence.Id;
导入javax.persistence.manytone;
导入javax.persistence.Transient;
/**
*
*@作者弗雷尔
*/
@实体
@访问权限(AccessType.FIELD)
公共类材料{
@身份证
私有字符串id;
//…几个附加字段,所有这些字段都可以正常工作
私有字符串substanceInstances=“”;
公共材料{
id=UUID.randomuid().toString();
}
公共字符串getId(){
返回id;
}
公共无效集合id(字符串id){
this.id=id;
}
//..省略字段的getter和setter
公共字符串getSubstanceInstances(){
返回实体指令;
}
public void setSubstanceInstances(字符串substanceInstances){
this.substanceInstances=substanceInstances;
}
/*如果我取消对这些行的注释,则不再创建DATATABLE
有办法解决这个问题吗?
公共列表getSubs(){
List subs=new ArrayList();
如果(!“”.equals(实体状态)){
列表值=Arrays.asList(substanceInstances.split(“|”);
值。forEach(值->{
子项添加(实体安装2.未序列化(值));
});
}
返回潜艇;
}
公共无效集合子集合(列表子集合){
实体状态=”;
subs.forEach(sub->{
substanceInstances=substanceInstances+sub.serialize()+“|”;
});
substanceInstances=substanceInstances.substring(0,substanceInstances.length()-1);
}
*/
只要我取消底部两个“unserialize”方法的注释,该类就可以正常工作作为嵌套在字符串substanceInstances中的对象,eclipselink不再创建数据表。是否有办法解决此问题,或者确实需要添加一个额外的层。与此同时,我实际找到了解决此问题的方法。如果在中使用lambda表达式,eclipselink似乎不会将实体bean转换为表方法。最后我转换了
values.forEach(value->{
subs.add(SubstanceInstance2.unSerialize(value));
});
进入
一切都很好。至于原因,不知道!编辑的异常堆栈的值很低,我将完整的堆栈跟踪放进去了。然后你遇到了类加载器问题,找到了一个过时的jar或类目录。这很好,但我如何检查/纠正这一点,我已经清理并重建了几个组件我使用的是Netbeans 8.1,而不是Maven。我发现了这个问题,它与类加载器无关,这是因为我的实体Bean中有其他方法。我将编辑这个问题
for (String value:values){
subs.add(SubstanceInstance2.unSerialize(value));
}