【问题标题】:JPA (Hibernate) issue with OneToOne mappedBy annotationOneToOne mappedBy 注释的 JPA (Hibernate) 问题
【发布时间】:2013-08-20 15:26:10
【问题描述】:

在设置 oneToOne 关系时,我有两个表。 比尔和比尔SimpleEntry。 (每个 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 配置(来自账单实体的 oneToOne 关系属性的 sn-p)。

@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
...

【问题讨论】:

  • 您是否要实现双向?
  • @KevinBowersox 我认为这是 uni。我已经用我的解释回复了你的回答。谢谢!

标签: hibernate jpa orm mapping one-to-one


【解决方案1】:

mappedBy 属性仅对bidirectional 关系是必需的,该元素可以在注解上省略。它用于源实体以指向目标实体上定义关系的字段(包含@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。有具体原因吗?谢谢。
  • 我之前确实尝试过您的建议 - @JoinColumn(name="billId").. 但我一直收到此错误---- 原因:org.hibernate.HibernateException: Missing column: billId in billrivedb.bill----- 但是 billId 在 BillSimpleEntry 表中而不是在 Bill 中。我真的很困惑!
  • 发布BillBillSimpleEntry 实体的完整源代码
  • 我已将两个实体内容添加到帖子中。如果您需要更多,请告诉我。谢谢!
猜你喜欢
  • 2021-03-22
  • 1970-01-01
  • 2011-09-29
  • 1970-01-01
  • 2011-12-07
  • 2021-09-07
  • 1970-01-01
  • 2012-02-24
  • 1970-01-01
相关资源
最近更新 更多