簡體   English   中英

如何在休眠中的OneToOne映射中使用@JoinColumn?

[英]how to use @JoinColumn in OneToOne mapping in hibernate?

我在@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)

你們可以幫我了解一下為什么會這樣的概念嗎?

您是否在使用二級緩存,按原因導致cannot be cast to java.io.Serializable at org.hibernate.type.CollectionType.getKeyOfOwner(CollectionType.java:414)顯示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接口

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;

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM