2016-08-15 2 views
1

guice, jpa 및 최대 절전 모드를 결합하려고합니다. 하이버 네이트의 초기화는 매핑 된 클래스 쓰루 DAO에 액세스하려고 시도 할 때까지 좋은 것처럼 보입니다. 나는 모든 도움 요청을 발견했다. 그러나 나의 문제는 (지금은) "커스텀 클래스"(적어도 나는 그렇게 생각하지 않는다)이다.최대 절전 모드 : 지속성을 찾을 수 없습니다 : java.math.BigDecimal

모두 함께 특별하지 않습니다. 나는 나의 클래스와 그 클래스 중 하나에 대한 기본 (persist, findById, remove) DAO를 정의하는 persistence.xml을 얻었다. 내가

final LayerDao dao = this.layerDaoProvider.get(); 
final Layer layer = dao.findById(386L); //Tried with BigDecimal, Long 

좋아하는 DAO와 데이터베이스에 액세스하려고하면

public abstract class AbstractDao<E, K> implements Dao<E, K> { 

    @Inject 
    private EntityManager manager; 
    private final Class<E> entityClass; 

    @SuppressWarnings("unchecked") 
    public AbstractDao() { 
     final ParameterizedType genericSuperclass = (ParameterizedType) this.getClass().getGenericSuperclass(); 
     this.entityClass = (Class<E>) genericSuperclass.getActualTypeArguments()[1]; 
    } 

    @Override 
    public void persist(final E entity) { 
     this.manager.persist(entity); 
    } 

    @Override 
    public void remove(final E entity) { 
     this.manager.remove(entity); 
    } 

    @Override 
    public E findById(final K id) { 
     return this.manager.find(this.entityClass, id); 
    } 
} 

나는 다음과 같은 오류를 (내가 java.lang.Long의과 동일한 오류가) 얻을 :

Caused by: org.hibernate.UnknownEntityTypeException: Unable to locate persister: java.math.BigDecimal 
    at org.hibernate.metamodel.internal.MetamodelImpl.locateEntityPersister(MetamodelImpl.java:637) ~[hibernate-core-5.2.2.Final.jar:5.2.2.Final] 
    at org.hibernate.internal.SessionImpl.locateEntityPersister(SessionImpl.java:2909) ~[hibernate-core-5.2.2.Final.jar:5.2.2.Final] 
    at org.hibernate.internal.SessionImpl.access$1800(SessionImpl.java:203) ~[hibernate-core-5.2.2.Final.jar:5.2.2.Final] 
    at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.<init>(SessionImpl.java:2660) ~[hibernate-core-5.2.2.Final.jar:5.2.2.Final] 
    at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.<init>(SessionImpl.java:2646) ~[hibernate-core-5.2.2.Final.jar:5.2.2.Final] 
    at org.hibernate.internal.SessionImpl.byId(SessionImpl.java:1181) ~[hibernate-core-5.2.2.Final.jar:5.2.2.Final] 
    at org.hibernate.internal.SessionImpl.find(SessionImpl.java:3357) ~[hibernate-core-5.2.2.Final.jar:5.2.2.Final] 
    at org.hibernate.internal.SessionImpl.find(SessionImpl.java:3332) ~[hibernate-core-5.2.2.Final.jar:5.2.2.Final] 
[..] 

일부 Java 코어 클래스에는 문제가 없을 것으로 예상됩니다.

이 내 모든 구성 Gradle을 종속성은 다음과 같습니다

compile group: 'org.slf4j', name: 'slf4j-api', version: '1.7.21'  
// https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-slf4j-impl 
compile group: 'org.apache.logging.log4j', name: 'log4j-slf4j-impl', version: '2.6.2' 
// https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core 
compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.6.2' 
// https://mvnrepository.com/artifact/com.google.inject/guice 
compile group: 'com.google.inject', name: 'guice', version: '4.1.0' 
// https://mvnrepository.com/artifact/com.google.inject.extensions/guice-persist 
compile group: 'com.google.inject.extensions', name: 'guice-persist', version: '4.1.0' 
// https://mvnrepository.com/artifact/com.cathive.fx/fx-guice 
compile group: 'com.cathive.fx', name: 'fx-guice', version: '8.0.0' 
// https://mvnrepository.com/artifact/org.hibernate/hibernate-core 
compile group: 'org.hibernate', name: 'hibernate-core', version: '5.2+' 

나는 무엇을 놓치고? 나를 도울 수있는 정보가 더 필요하십니까?

편집 # 1 : 매핑 된 클래스에 액세스하려고합니다. 이클립스 (최신 JEE 에디션)로 자동 생성됩니다 :

import java.io.Serializable; 
import javax.persistence.*; 
import java.math.BigDecimal; 
import java.util.Date; 


/** 
* The persistent class for the T_M_LAYER_NEU database table. 
* 
*/ 
@Entity 
@Table(name="T_M_LAYER_NEU") 
@NamedQuery(name="Layer.findAll", query="SELECT l FROM Layer l") 
public class Layer implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Id 
    @SequenceGenerator(name="T_M_LAYER_NEU_ID_GENERATOR", sequenceName="FIG_SYS_SEQ") 
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="T_M_LAYER_NEU_ID_GENERATOR") 
    @Column(unique=true, nullable=false, precision=38) 
    private long id; 

    @Column(nullable=false, precision=1) 
    private BigDecimal component; 

    @Column(name="DISPLAY_ORDER", nullable=false, precision=3) 
    private BigDecimal displayOrder; 

    @Column(nullable=false, precision=1) 
    private BigDecimal exklusiv; 

    @Column(name="GEOMETRIETYP_ID_FK", precision=2) 
    private BigDecimal geometrietypIdFk; 

    @Temporal(TemporalType.DATE) 
    @Column(name="GUELTIG_BIS", nullable=false) 
    private Date gueltigBis; 

    @Temporal(TemporalType.DATE) 
    @Column(name="GUELTIG_VON", nullable=false) 
    private Date gueltigVon; 

    @Column(nullable=false, precision=1) 
    private BigDecimal isactive; 

    @Column(nullable=false, precision=1) 
    private BigDecimal iskulisse; 

    @Column(nullable=false, precision=1) 
    private BigDecimal isoverview; 

    @Column(name="LAYERTYP_ID_FK", nullable=false, precision=2) 
    private BigDecimal layertypIdFk; 

    @Column(nullable=false, length=80) 
    private String name; 

    @Column(name="R_O", nullable=false, precision=1) 
    private BigDecimal rO; 

    @Column(name="SOURCE_ID", precision=38) 
    private BigDecimal sourceId; 

    @Column(name="\"SYSTEM\"", nullable=false, precision=1) 
    private BigDecimal system; 

    @Column(name="USE_COMPLETECACHE", nullable=false, precision=1) 
    private BigDecimal useCompletecache; 

    @Column(name="XML_DEF", length=100) 
    private String xmlDef; 

    //bi-directional many-to-one association to Label 
    @ManyToOne 
    @JoinColumn(name="LABEL_ID_FK") 
    private Label label; 

    //bi-directional many-to-one association to Symbol 
    @ManyToOne 
    @JoinColumn(name="SYM_ID_FK") 
    private Symbol symbol; 

    //bi-directional many-to-one association to Tabellen 
    @ManyToOne 
    @JoinColumn(name="LAYERDEF_ID_FK") 
    private Tabellen table; 

    public Layer() { 
    } 

    public long getId() { 
     return this.id; 
    } 

    public void setId(long id) { 
     this.id = id; 
    } 

    public BigDecimal getComponent() { 
     return this.component; 
    } 

    public void setComponent(BigDecimal component) { 
     this.component = component; 
    } 

    public BigDecimal getDisplayOrder() { 
     return this.displayOrder; 
    } 

    public void setDisplayOrder(BigDecimal displayOrder) { 
     this.displayOrder = displayOrder; 
    } 

    public BigDecimal getExklusiv() { 
     return this.exklusiv; 
    } 

    public void setExklusiv(BigDecimal exklusiv) { 
     this.exklusiv = exklusiv; 
    } 

    public BigDecimal getGeometrietypIdFk() { 
     return this.geometrietypIdFk; 
    } 

    public void setGeometrietypIdFk(BigDecimal geometrietypIdFk) { 
     this.geometrietypIdFk = geometrietypIdFk; 
    } 

    public Date getGueltigBis() { 
     return this.gueltigBis; 
    } 

    public void setGueltigBis(Date gueltigBis) { 
     this.gueltigBis = gueltigBis; 
    } 

    public Date getGueltigVon() { 
     return this.gueltigVon; 
    } 

    public void setGueltigVon(Date gueltigVon) { 
     this.gueltigVon = gueltigVon; 
    } 

    public BigDecimal getIsactive() { 
     return this.isactive; 
    } 

    public void setIsactive(BigDecimal isactive) { 
     this.isactive = isactive; 
    } 

    public BigDecimal getIskulisse() { 
     return this.iskulisse; 
    } 

    public void setIskulisse(BigDecimal iskulisse) { 
     this.iskulisse = iskulisse; 
    } 

    public BigDecimal getIsoverview() { 
     return this.isoverview; 
    } 

    public void setIsoverview(BigDecimal isoverview) { 
     this.isoverview = isoverview; 
    } 

    public BigDecimal getLayertypIdFk() { 
     return this.layertypIdFk; 
    } 

    public void setLayertypIdFk(BigDecimal layertypIdFk) { 
     this.layertypIdFk = layertypIdFk; 
    } 

    public String getName() { 
     return this.name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public BigDecimal getRO() { 
     return this.rO; 
    } 

    public void setRO(BigDecimal rO) { 
     this.rO = rO; 
    } 

    public BigDecimal getSourceId() { 
     return this.sourceId; 
    } 

    public void setSourceId(BigDecimal sourceId) { 
     this.sourceId = sourceId; 
    } 

    public BigDecimal getSystem() { 
     return this.system; 
    } 

    public void setSystem(BigDecimal system) { 
     this.system = system; 
    } 

    public BigDecimal getUseCompletecache() { 
     return this.useCompletecache; 
    } 

    public void setUseCompletecache(BigDecimal useCompletecache) { 
     this.useCompletecache = useCompletecache; 
    } 

    public String getXmlDef() { 
     return this.xmlDef; 
    } 

    public void setXmlDef(String xmlDef) { 
     this.xmlDef = xmlDef; 
    } 

    public Label getLabel() { 
     return this.label; 
    } 

    public void setLabel(Label label) { 
     this.label = label; 
    } 

    public Symbol getSymbol() { 
     return this.symbol; 
    } 

    public void setSymbol(Symbol symbol) { 
     this.symbol = symbol; 
    } 

    public Tabellen getTable() { 
     return this.table; 
    } 

    public void setTable(Tabellen table) { 
     this.table = table; 
    } 
} 

편집 # 2 : 사용 된 DAO 클래스. 제네릭에 대한 유형 정의를 제외하고는 아무것도 들어 있지 않습니다.

public class LayerDao extends AbstractDao<Layer, Long> { 

} 

답변

1

마지막으로 실수를 발견했습니다. AbtractDao 생성자에서 내가 클래스 유형을 결정하는 매우 일반적인 코드를 사용

final ParameterizedType genericSuperclass = (ParameterizedType) this.getClass().getGenericSuperclass(); 
this.entityClass = (Class<E>) genericSuperclass.getActualTypeArguments()[1]; 

자세히 살펴 내가 키 객체 형 genericSuperclass.getActualTypeArguments() 대신의 [1]를 사용하려고 것으로 나타났다 엔티티 객체 유형 genericSuperclass.getActualTypeArguments() [0].

올바른 생성자이 지금

@SuppressWarnings("unchecked") 
    public AbstractDao() { 
     final ParameterizedType genericSuperclass = (ParameterizedType) this.getClass().getGenericSuperclass(); 
     this.entityClass = (Class<E>) genericSuperclass.getActualTypeArguments()[0]; 
    } 

처럼 보이는 모든 것이 예상대로 작동합니다. 불편을 드려 죄송합니다.