2015-11-01 165 views
1

我遇到了映射到同一个实体的问题。实体代表树节点,它假定父母和孩子由同一实体定义:JPA实体映射 - 链接相同的实体

编号级

@MappedSuperclass 
public class ParentId { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "ID") 
    private long id; 

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

实体类

@Entity 
@Table(name = "NAVIGATION_TREE_NODE") 
public class NavigationTreeNode extends ParentId { 

    @Column(name = "NODE_NAME") 
    private String nodeName; 

    @Column(name = "NODE_TYPE") 
    @Enumerated(EnumType.ORDINAL) 
    private NodeType nodeType; 

    @ManyToOne(fetch = FetchType.EAGER) 
    @JoinColumn(name = "ENTITY_ID") 
    private NavigationTreeNode parent; 

    @OneToMany(mappedBy = "parent") 
    private List<NavigationTreeNode> children; 

    public String getNodeName() { 
     return nodeName; 
    } 

    public void setNodeName(String nodeName) { 
     this.nodeName = nodeName; 
    } 

    public NodeType getNodeType() { 
     return nodeType; 
    } 

    public void setNodeType(NodeType nodeType) { 
     this.nodeType = nodeType; 
    } 

    public void setParent(NavigationTreeNode parent) { 
     this.parent = parent; 
    } 

    public NavigationTreeNode getParent() { 
     return parent; 
    } 

    public void setChildren(List<NavigationTreeNode> children) { 
     this.children = children; 
    } 

    public List<NavigationTreeNode> getChildren() { 
     return children; 
    } 

    public enum NodeType { 
     ROOT, 
     NODE, 
     LEAF; 

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

SQL

CREATE TABLE "DEV1"."NAVIGATION_TREE_NODE" 
    ( "ID" NUMBER NOT NULL ENABLE, 
    "NODE_NAME" VARCHAR2(30 BYTE), 
    "NODE_TYPE" VARCHAR2(20 BYTE), 
    "PARENT_ID" NUMBER, 
    "ENTITY_ID" NUMBER, 
    PRIMARY KEY ("ENTITY_ID") 
    USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
    STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 
    PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) 
    TABLESPACE "SYSTEM" ENABLE, 
    FOREIGN KEY ("PARENT_ID") 
     REFERENCES "DEV1"."NAVIGATION_TREE_NODE" ("ENTITY_ID") ENABLE 
    ) SEGMENT CREATION IMMEDIATE 
    PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING 
    STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 
    PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) 
    TABLESPACE "SYSTEM" ; 

    CREATE OR REPLACE TRIGGER "DEV1"."NAVIGATION_TREE_NODE_TRIGGER" 
    before insert on NAVIGATION_TREE_NODE 
    for each row 
begin 
    select dev1_seq.nextval 
    into :new.id 
    from dual; 
end; 

当我尝试编译它时抛出以下异常:

Caused by: java.sql.SQLException: ORA-17059 Fail to convert to internal representation 
    at oracle.jdbc.driver.CharCommonAccessor.getInt(CharCommonAccessor.java:147) 
    at oracle.jdbc.driver.T4CVarcharAccessor.getInt(T4CVarcharAccessor.java:830) 
    at oracle.jdbc.driver.OracleResultSetImpl.getInt(OracleResultSetImpl.java:942) 
    at oracle.jdbc.driver.OracleResultSet.getInt(OracleResultSet.java:438) 
    at org.hibernate.type.EnumType$OrdinalEnumValueMapper.getValue(EnumType.java:372) 
    at org.hibernate.type.EnumType.nullSafeGet(EnumType.java:107) 
    at org.hibernate.type.CustomType.nullSafeGet(CustomType.java:127) 
    at org.hibernate.type.AbstractType.hydrate(AbstractType.java:106) 
    at org.hibernate.persister.entity.AbstractEntityPersister.hydrate(AbstractEntityPersister.java:2969) 
    at org.hibernate.loader.Loader.loadFromResultSet(Loader.java:1696) 
    at org.hibernate.loader.Loader.instanceNotYetLoaded(Loader.java:1628) 
    at org.hibernate.loader.Loader.getRow(Loader.java:1515) 
    at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:726) 
    at org.hibernate.loader.Loader.processResultSet(Loader.java:953) 
    at org.hibernate.loader.Loader.doQuery(Loader.java:921) 
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:355) 
    at org.hibernate.loader.Loader.doList(Loader.java:2554) 
    ... 35 more 

请问如何解决这个问题?谢谢。

+0

“Сбойпреобразованиявовнутреннеепредставление” 不是很理解的非俄罗斯用户。请为此提供英文翻译,否则这里的大多数程序员将无法提供帮助。最佳:编辑原始帖子并将其替换。 – MWiesner

+1

ORA-17059无法转换为内部表示 –

回答

3

你有

@Column(name = "NODE_TYPE") 
@Enumerated(EnumType.ORDINAL) // <-- as a number 
private NodeType nodeType; 

但在你的SQL是

"NODE_TYPE" VARCHAR2(20 BYTE). 
+0

您是对的。它解决了! – aime