如何正确设置hibernate单向一对一映射

时间:2014-07-16 21:37:39

标签: java hibernate mapping one-to-one

我有两个表,列上有one-to-one映射。我想使用注释设置unidirectional one-to-one hibernate映射,因为我希望能够从连接表中获取结果,但不希望对子表进行外部约束检查。

这是我的快速代码。

@Entity
@Table(name = "student")
public class student {

// primary key and other column definition here..

    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name="address_id")
    private Address address;

// getters and //setters
}

@Entity
@Tale(name = "address") 
public class address {
    @Id
    @GeneratedValue(generator = "hibernate-uuid")
    @GenericGenerator(name = "hibernate-uuid", strategy = uuid")
    @Column(name = "id", unique = true, length = 36, nullable = false)
    private String id;

    @Column(name="address_id")
    private String address_id;

    // getters and setters
}
当我尝试插入学生(但不是地址)时,上面的

给了我以下异常。

Caused by: org.hibernate.AnnotationException: A Foreign key refering com.test.Student from com.test.Address has the wrong number of column. should be 2

我在这里做错了什么?

1 个答案:

答案 0 :(得分:2)

首先,将级联类型更改为student类中的REFRESH(最好将其删除)。然后,如果它是单向的,意味着另一部分不知道它的任何内容。因此,您应该将referenceColumnName添加到@OneToOne

@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "PK_OF_THE_OTHER_TABLE", referencedColumnName = "CURRENT_TABLE_COLUMN_REFERENCE", nullable = false, insertable = false, updatable = false)

通过此实施,您不会更新其他部分,而是加入并获取您需要的信息

更新 - PK_OF_THE_OTHER_TABLEaddress表的主键。另外CURRENT_TABLE_COLUMN_REFERENCE是你的外键(当前表的字段指向address表) - 我假设你把你的一对一关系放在Student实体中。