【问题标题】:how to properly set up hibernate unidirectional one-to-one mapping如何正确设置休眠单向一对一映射
【发布时间】:2014-09-07 14:20:45
【问题描述】:

我有两个表,在一个列上有 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

我在这里做错了什么?

【问题讨论】:

  • 如果您是 Hibernate 新手,您可能会发现我的教程 here 很有用。

标签: java hibernate mapping one-to-one


【解决方案1】:

首先,在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 实体中。

【讨论】:

  • 感谢您的建议。我用你的建议更新了我的代码,除了我排除了 nullable=false 部分。但我得到了异常,因为从连接表返回结果集要求从不存在的学生表中获取 PK_OF_THE_OTHER_TABLE。
  • 我最终在谷歌上搜索并发现 name 和 referenceColumnName 值在您的第一次发布中被交换了。但尽管如此,我还是采用了你的方法,到目前为止它似乎有效。我现在面临的唯一问题是,当我在没有要加入的记录时尝试从联合表中获取记录时,休眠会抱怨子表中的未知列。但这是一个不同的问题。谢谢。
  • 没问题。顺便说一下,referencedColumnName 在这里描述:objectdb.com/api/java/jpa/JoinColumn/referencedColumnName
猜你喜欢
  • 2013-05-23
  • 1970-01-01
  • 2012-06-22
  • 1970-01-01
  • 1970-01-01
  • 2011-04-07
  • 1970-01-01
  • 2015-08-22
相关资源
最近更新 更多