mysql - 当持久化实体之间具有一对一关系时,JPA 会出现 Hibernate 问题

标签 mysql sql hibernate jpa orm

我有两个表 - bill 和 billSimpleentry 以及两个相应的实体类 Bill 和 BillSimpleEntry。

Bill 和 BillSimplentry 具有一对一的关系。每张账单都有一张账单简单。所以billsimplementry.billId与bill.id的对应值相同。

SQL 结构:

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

CREATE TABLE `billsimpleentry` (
  `itemTitle` varchar(200) DEFAULT NULL,
  `itemDescription` text,
  `billId` bigint(20) NOT NULL,
  PRIMARY KEY (`billId`),
  KEY `fk_bill_idx` (`billId`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;

因此,当新的“bill”对象被持久化时,它还应该在数据库中创建一个 billsimpleentry 行。

save(Bill newBill){
em.persist(newBill);
}

账单类结构:

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

    private static final long serialVersionUID = -5660869020353250221L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)  
    private Long id;
    private String title;
    ....
    private Long groupId;
    private BigDecimal  billTotal;

    @OneToOne(cascade=CascadeType.ALL,fetch = FetchType.EAGER)
    @PrimaryKeyJoinColumn
    private BillSimpleEntry billSimpleEntry;
   ... getters & setters...
}

BillSimpleEntry:

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

    @Id
        @GeneratedValue(strategy = GenerationType.AUTO)  
        private Long billId;
        @Column(columnDefinition="TEXT")
    private String itemDescription;


         @OneToMany(cascade=CascadeType.ALL,mappedBy="billSimpleEntryId",fetch = FetchType.EAGER)
    private List<SimpleUserIdAndLiableCost> simpleUserIdAndLiableCost = new ArrayList<SimpleUserIdAndLiableCost>();
        ... getters & setters...

}

这是尝试保存的 newBill obj 数据

{
   "id":null,
   "title":"",
   "billDate":null,
   "billPayerId":6,
   "notes":null,
   "billCreaterId":null,
   "groupId":3,
   "billTotal":null,
   "billSimpleEntry":{
      "billId":null,
      "itemDescription":null,
      "simpleUserIdAndLiableCost":[
         {
            "userId":6,
            "liableCost":"50",
            "id":null,
            "billSimpleEntryId":null,
            "user":{
               "id":null,
               "fName":"doe",
               "lName":"doe"
            },
            "isActive":true
         },
         {
            "userId":7,
            "liableCost":"50",
            "id":null,
            "billSimpleEntryId":null,
            "user":{
               "id":null,
               "fName":"doe",
               "lName":"doe"
            },
            "isActive":true
         },
         {
            "userId":8,
            "liableCost":"50",
            "id":null,
            "billSimpleEntryId":null,
            "user":{
               "id":null,
               "fName":"doe",
               "lName":"doe"
            },
            "isActive":true
         }
      ],
      "itemDescriptionId":2
   },
   "billItemEntry":[

   ],
   "userId":null
}

但问题是 em.persist(Bill) 失败,因为 billsimplentry.billId 值需要填充为与 bill.id 相同的值。我应该如何解决这个问题?看来我需要更新我的表结构或表自动 ID 生成策略。任何见解将不胜感激。

最佳答案

抱歉,但我需要更多说明。我不知道你是如何创建该 JSON 的,但其中有这个 "billId":null。您需要设置父ID。因此,如果这是 JSON,请在持久化之前对其进行处理,并将父 ID 附加到它。保存或保留不应自动将父 ID 附加到子 ID。

关于mysql - 当持久化实体之间具有一对一关系时,JPA 会出现 Hibernate 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19595536/

相关文章:

mysql - JPA 类型映射问题

php - 就像限制不能正常工作一样?

MYSQL Count Distinct year 在单个查询中制作模型?

mysql - 如何使用Sql触发器列出表中的所有列

SQL - 选择其子行的列包含特定字符串的行

sql - 优化大型表上的 SQL 连接

java - Hibernate 和 Oracle 序列

php - Drupal 到 zen cart sql 查询转换

java - Hibernate更新某个值

hibernate - tomcat启动报错: for my spring web-app