【问题标题】:how to use @JoinColumn in OneToOne mapping in hibernate?如何在休眠中的 OneToOne 映射中使用 @JoinColumn?
【发布时间】:2017-03-29 06:43:46
【问题描述】:

我在@JoinColumn 上看到过很多问题,这个概念对我来说很清楚,直到我遇到以下情况。

让我们考虑映射是 OneToOne 单向映射。我在父类中使用了以下注释: 情况1:- @JoinColumn(name="test_Id",referencedColumnName="refToPrimaryKey") 和 Entity 类没有实现 Serializable 接口。在这种情况下,程序正在执行,没有任何异常。 案例2:- @JoinColumn(name="test_Id",referencedColumnName="refToNonPrimaryKey") 和 Entity 类没有实现 Serializable 接口。

这里程序抛出异常,如:

threw exception [java.lang.ClassCastException: 
com.homecare.persistance.resource.TestEntity cannot be cast to java.io.Serializable] with root cause
java.lang.ClassCastException: com.homecare.persistance.resource.TestEntity cannot be cast to java.io.Serializable at org.hibernate.type.CollectionType.getKeyOfOwner(CollectionType.java:414)

你们能帮我了解一下为什么会发生这种情况吗?

【问题讨论】:

    标签: java hibernate serialization


    【解决方案1】:

    您是否使用二级缓存,根据引起的显示 cannot be cast to java.io.Serializable at org.hibernate.type.CollectionType.getKeyOfOwner(CollectionType.java:414)

    根据休眠文档,disassemble 返回对象的反汇编表示。这是 Hibernate 将在二级缓存中使用的值,因此应注意将值分解为最简单的形式;特别是对于实体,这 意味着将它们分解成它们的组成部分。

    如果你会检查 org.hibernate.type.CollectionType 包

        //This solution would allow us to eliminate the owner arg to disassemble(), but
        //what if the collection was null, and then later had elements added? seems unsafe
        //session.getPersistenceContext().getCollectionEntry( (PersistentCollection) value ).getKey();
    
        final Serializable key = getKeyOfOwner(owner, session);
        if (key==null) {
            return null;
        }
        else {
            return getPersister(session)
                    .getKeyType()
                    .disassemble( key, session, owner );
        }
    

    所以你需要在你的实体中实现 Serializable 接口

    【讨论】:

    • Bushman 我没有使用二级缓存。我只是尝试使用注释 @JoinColumn 来引用非键列。
    【解决方案2】:
    Please find below code.let me know  if you need  any other information:
    @Setter
    @Getter
    @Entity
    @Table(name="test")
    public class TestEntity imple`enter code here`ments Serializable{
         @Id 
         @GeneratedValue(strategy = GenerationType.AUTO)
         @Column(name = "id")
         private int id;
         @Column(name="name")
         private String name;
         @Column(name="roll")
         private int roll;
         @Column(name="stream")
         private String stream;
         @OneToMany(cascade=CascadeType.ALL)
         @JoinColumn(name="for_Key",referencedColumnName="roll")
         private List<TestEntityChild> testEntityChildList;
    }
    Chile Entity class
     @Getter
    @Setter
    @Entity
    @Table(name="testchild")
    public class TestEntityChild {
      @Id
      @GeneratedValue(strategy = GenerationType.AUTO)
      @Column(name="Test_id")
      private int testId;
    
      @Column(name="city")
      private String city;
      @Column(name="state")
      private String state;
    
    }
    

    【讨论】:

      猜你喜欢
      • 2014-12-27
      • 2014-03-12
      • 2011-05-21
      • 2017-11-13
      • 2016-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多