JPA实体映射 - 链接同一实体

时间:2015-11-01 16:55:48

标签: java jpa

我遇到了映射到同一实体的问题。实体表示树节点,它假定父节点和子节点由同一实体定义:

的Id-类

@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

请问您如何更正代码?感谢。

1 个答案:

答案 0 :(得分:3)

你有

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

但是在你的SQL中

"NODE_TYPE" VARCHAR2(20 BYTE).