0

对于实施例其他ID,我有A级与级联到B:休眠级联从另一个数据库

public class A{ 

    private String id; 
    private Set<B> bs = new HashSet<B>(0); 

    @Id 
    @GenericGenerator(name = "seq_id", strategy = generators.SequenceIdGenerator") 
    @GeneratedValue(generator = "seq_id") 
    @COLUMN(name="id" unique = true, nullable = false, length = 28) 
    public void getId(){ 
     return this.id; 
    } 

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "A") 
    @Cascade({CascadeType.SAVE_UPDATE, CascadeType.DELETE, CascadeType.PERSIST}) 
    public void getBs(){ 
     return bs; 
    } 
} 

和我有B,其具有它自己的ID和从A

public class B 

    String id; 
    String aId; 
    A a; 

    @Id 
    @GenericGenerator(name = "seq_id", strategy = "generators.SequenceIdGenerator") 
    @GeneratedValue(generator = "seq_id") 
    @Column(name = "ID", unique = true, nullable = false, length = 28) 
    public String getId() { 
     return this.id; 
    } 

    @Column(name = "A_ID", nullable = false, length = 28) 
    public String getAId() { 
     return aId; 
    } 

    public void setAId(String aId) { 
     this.aId = aId; 
    } 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "A_ID", nullable = false, insertable = false, updatable = false) 
    @MapsId("aId") 
    public Admission getAdmission() { 
     return this.admission; 
    } 

    public void setAdmission(Admission admission) { 
    this.admission = admission; 
    } 
包含ID的列

如何在保存A时自动分配aId?我想要设置一个ID,但是我总是得到一个错误,说A_ID不能设置为空。

谢谢!

回答

1

当使用带有共享映射的派生标识符时,不仅需要将@MapsId注释放入关系中,而且还需要将引用关系id的字段与@Id注释区分开来。

了解如何做到这一点(中省略制定者):

public class B { 
    String id; 
    String aId; 
    A a; 

    @Id 
    @GenericGenerator(name = "seq_id", strategy = "generators.SequenceIdGenerator") 
    @GeneratedValue(generator = "seq_id") 
    @Column(name = "ID", unique = true, nullable = false, length = 28) 
    public String getId() { 
     return this.id; 
    } 

    @Id 
    public String getAId() { 
     return aId; 
    } 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "A_ID", nullable = false) 
    @MapsId("aId") 
    public A getA() { 
     return this.a; 
    } 
} 

对方误以为是你注释你的关系是updatable = falseinsertable = false,使持久性提供忽略这个字段的写入数据库。