【问题标题】:JPA entity mapping - linking the same entityJPA 实体映射 - 链接同一个实体
【发布时间】:2015-11-01 16:55:47
【问题描述】:

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

身份等级

@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

能否请您帮助如何更正代码?谢谢。

【问题讨论】:

  • "Сбой преобразования во внутреннее представление" 对非俄罗斯用户来说不是很容易理解。请为此提供英文翻译,否则这里的大多数程序员将无法提供帮助。最佳:编辑原始帖子并将其替换。
  • ORA-17059 无法转换为内部表示

标签: java jpa


【解决方案1】:

你有

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

但在你的 SQL 中是

"NODE_TYPE" VARCHAR2(20 BYTE).

【讨论】:

    猜你喜欢
    • 2011-07-13
    • 1970-01-01
    • 2015-07-02
    • 2021-09-13
    • 1970-01-01
    • 2019-10-28
    • 2013-08-18
    • 2019-02-13
    • 1970-01-01
    相关资源
    最近更新 更多