2017-07-02 36 views
0

我有兩個實體Resource(表資源)和VideoInfo(表video_info),從VideoInfoResource之間存在一對一的單向關係。以下代碼保存一對一關係,但保存的列resource.id不等於video_info.resourceId。註釋有什麼問題嗎?我知道我可以手動設置video_info.resourceId等於Resource.id,是否存在任何自動方式?休眠一對一映射,如何使兩個實體具有相同的主鍵

public static void main(String[] args) throws IOException { 
    Resource r=new Resource(); 
    r.setName("test"); 
    r.setPath("foo"); 
    r.setType("video"); 
    VideoInfo videoInfo=new VideoInfo(); 
    videoInfo.setResource(r); 
    Session session=Database.getSessionFactory().openSession(); 
    Transaction transaction=session.beginTransaction(); 
    try { 
     session.save(videoInfo); 
     transaction.commit(); 
    }catch (Exception e){ 
     transaction.rollback(); 
     return; 
    } 
    System.out.println(r.getId()); 
    System.out.println(videoInfo.getResourceId()); 
} 

輸出:

19 
0 

VideoInfo實體:

@Entity 
@Table(name = "video_info") 
public class VideoInfo { 
    @Id 
    private int resourceId; 
    @Column(name = "type") 
    private String type; 
    @Column(name = "time") 
    private Integer time; 
    @Column(name = "actors") 
    private String actors; 
    @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL) 
    @JoinColumn(name = "resourceId") 
    private Resource resource; 

    //getters and setters 

} 

資源實體:

@Entity 
@Table(name = "resource") 
public class Resource { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private int id; 
    @Column(name = "name") 
    private String name; 
    @Column(name = "path") 
    private String path; 
    @Column(name = "type") 
    private String type; 

    //getters and setters 
} 
+0

您是否試圖爲這兩個實體使用相同的主鍵? – Ranjeet

回答

0

我來回答我的問題:由於此鏈接@OneToOne With Shared Primary Key, Revisited說,我應該使用@MapsId註解。

@Entity 
@Table(name = "video_info") 
public class VideoInfo { 
    @Id 
    private int resourceId; 
    @Column(name = "type") 
    private String type; 
    @Column(name = "time") 
    private Integer time; 
    @Column(name = "actors") 
    private String actors; 
    @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL) 
    @JoinColumn(name = "resourceId") 
    @MapsId 
    private Resource resource; 

    //getters and setters 
} 
0

您是否嘗試過@PrimaryKeyJoinColumn註解?

像這樣:

@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL) 
@PrimaryKeyJoinColumn 
private Resource resource; 

關注這個link更好地理解