JPA(Hibernate)中使用OneToOne mappedBy注释的问题

7

我需要为两个表建立一对一的关系,它们分别是Bill和BillSimpleEntry。(每个Bill对应一个BillSimpleEntry)

以下是它们的结构:

CREATE TABLE `bill` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  ..
  ..
  PRIMARY KEY (`id`),
  UNIQUE KEY `id_UNIQUE` (`id`),
  KEY `fk_bill_groups1_idx` (`groupId`),
  KEY `fk_bill_user1_idx` (`billPayerId`),
  CONSTRAINT `fk_b...` FOREIGN KEY (`groupId`) REFERENCES `groups` (`id`) ON D     ELETE  NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `fk_b...` FOREIGN KEY (`billPayerId`) REFERENCES `user` (`id`) ON    DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;



DROP TABLE IF EXISTS `billsimpleentry`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `billsimpleentry` (
  `..` varchar(200) DEFAULT NULL,
  `..` text,
  `billId` bigint(20) DEFAULT NULL,
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`),
  KEY `fk_bill_idx` (`billId`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1;

JPA配置(来自bill实体的oneToOne关系属性代码片段)。
@OneToOne(cascade=CascadeType.ALL,mappedBy="billId",fetch = FetchType.EAGER)
private BillSimpleEntry billSimpleEntry;

我试图通过billSimpleEntry.billId和bill.Id将Bill和BillSimpleEntry进行连接。但是我似乎遇到了错误。
以下是我收到的错误信息-
Caused by: org.hibernate.AnnotationException: Referenced property not a (One|Many)ToOne:
com.uh.br.domain.BillSimpleEntry.billId in mappedBy of    
com.uh.br.domain.Bill.billSimpleEntryry

这是实体列表

Bill.java
@Entity
@Table(name = "bill")
public class Bill implements GenericObject {

/**
 *
 */
private static final long serialVersionUID = -5660869020353250221L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)  
private Long id;

...
..
@OneToOne(cascade=CascadeType.ALL,fetch = FetchType.EAGER)
@JoinColumn(name="billId")
private BillSimpleEntry billSimpleEntry;

...
getters & setters
...
}

BillSimpleEntry.java
@Entity
@Table(name="billsimpleentry")
public class BillSimpleEntry  implements GenericObject{

@Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)  
    private Long id;
    private Long billId;
    @Column(columnDefinition="TEXT")
private String itemDescription;//napkin
...
...

    ...
getters & setters
...

你是想要使它双向的吗? - Kevin Bowersox
@KevinBowersox 我认为是uni。我已在下面回复了我的解释。谢谢! - user6123723
1个回答

18

mappedBy属性仅在双向关联中才是必需的,此元素可以在注释中省略。它用于源实体上指向目标实体上定义关系(包含@JoinColumn的字段)的字段。

@JoinColumn 注释应该放置在 billSimpleEntry 字段上,以定义应该用于连接两个表的列。对于 OneToOne 关系,应按以下方式进行操作:

  

如果连接是用于使用外键映射策略的 OneToOne 或 ManyToOne 映射,则外键列位于源实体或可嵌入的表中。

这是一个代码示例:

@OneToOne(cascade=CascadeType.ALL,fetch = FetchType.EAGER)
@JoinColumn(name="id")
private BillSimpleEntry billSimpleEntry;

此外,如果 Bill 包含了 SimpleBillEntry 字段,则 BILL 表应该包含指向 billsimpleentry 表的外键。


您的意思是双向关系指如果我想要将每个表的关联放在彼此中,对吗?在我的情况下,查询账单时只需要提取BillSimpleEntry而不需要反向查询。所以我想这是单向关系?此外,您编码了@JoinColumn(name="BILL_ID")而不是billId,有特定的原因吗?谢谢。 - user6123723
我之前尝试了你的建议 - @JoinColumn(name="billId").. 但是我一直收到这个错误 ---- Caused by: org.hibernate.HibernateException: Missing column: billId in billrivedb.bill----- 但是billId在BillSimpleEntry表中而不是Bill表中。我真的很困惑! - user6123723
иѓЈеПСеЄГ Bill еТМ BillSimpleEntry еЃЮдљУзЪДеЃМжХіжЇРдї£з†БгАВ - Kevin Bowersox
我已经将两个实体的内容添加到了文章中。如果您需要更多信息,请告诉我。谢谢! - user6123723
让我们在聊天中继续这个讨论:http://chat.stackoverflow.com/rooms/35708/discussion-between-user1324816-and-kevin-bowersox - user6123723

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接