JPA / Hibernate尝试在复合标识实体中存储太多参数(以及加倍属性) [英] JPA/Hibernate tries to store too many parameters in entity with composite Id (and doubling properties)

查看:115
本文介绍了JPA / Hibernate尝试在复合标识实体中存储太多参数(以及加倍属性)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有复合标识的实体

  @Entity 
@IdClass(value = BorrowId.class)
@Table(name =BORROW)
public class Borrow {

@Id
@Column(name =BOOK_ID,insertable = false,updatable = false)
私人长bookId;

@Id
@Column(name =BORROWER_ID,可插入= false,可更新= false)
private long borrowerId;

@Id
@ManyToOne(fetch = FetchType.LAZY,cascade = {CascadeType.PERSIST,CascadeType.MERGE,CascadeType.REFRESH})
@JoinColumn(name =BOOK_ID )
私人图书;

@Id
@ManyToOne(fetch = FetchType.EAGER,cascade = {CascadeType.PERSIST,CascadeType.MERGE,CascadeType.REFRESH})
@JoinColumn(name =BORROWER_ID )
私人借款人借款人;

@Id
@Column(name =BORROW_DATE)
私人日期borrowDate;

@Column(name =RETURN_DATE)
private日期returnDate;

BorrowId具有属性(所有内容都是getters / setters)

  private long bookId; 
private long borrowerId;

私人日期borrowDate;

和equals,hashCode方法

when我试图坚持借用实体(书籍和借款人属性设置为相应的实体,然后调用entityManager.persist(借用);)
我的日志里有:


Hibernate:insert into BORROW(BORROWER_ID,BOOK_ID,RETURN_DATE,
BORROW_DATE)values(?,?,?,?)//这个插入语句是正确的
(这是我的表格的外观)参数
parameterIndex的值5[90008-174]


所以它看起来像有人做错了什么:)
如何解决这个问题?是我的实体声明有缺陷? (我想用CompositeId来学习使用它)

解决方案

感谢@JB nizet

  @Id 
@Column(name =BOOK_ID,insertable = false,updatable = false)
private long bookId;

@Id
@Column(name =BORROWER_ID,可插入= false,可更新= false)
private long borrowerId;

@MapsId(bookId)
@ManyToOne(fetch = FetchType.LAZY,cascade = {CascadeType.PERSIST,
CascadeType.MERGE,
CascadeType.REFRESH })
@JoinColumn(name =BOOK_ID)
私人图书;

@MapsId(borrowerId)
@ManyToOne(fetch = FetchType.EAGER,cascade = {CascadeType.PERSIST,
CascadeType.MERGE,
CascadeType.REFRESH })
@JoinColumn(name =BORROWER_ID)
私人借款人借款人;

@Id
@Column(name =BORROW_DATE)
私人日期borrowDate;

解决这个问题很奇怪,因为在任何示例/教程中都不存在 @MapsId @IdClass 一起使用。
我不确定现在是否需要 @JoinColumn


I have entity with composite Id

@Entity
@IdClass(value = BorrowId.class)
@Table(name = "BORROW")
public class Borrow {

    @Id
    @Column(name = "BOOK_ID", insertable = false, updatable = false)
    private long bookId;

    @Id
    @Column(name = "BORROWER_ID", insertable = false, updatable = false)
    private long borrowerId;

    @Id
    @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH})
    @JoinColumn(name = "BOOK_ID")
    private Book book;

    @Id
    @ManyToOne(fetch = FetchType.EAGER, cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH})
    @JoinColumn(name = "BORROWER_ID")
    private Borrower borrower;

    @Id
    @Column(name = "BORROW_DATE")
    private Date borrowDate;

    @Column(name = "RETURN_DATE")
    private Date returnDate;

BorrowId has properties (everything with getters/setters)

    private long bookId;
    private long borrowerId;

    private Date borrowDate;

and equals,hashCode methods

when I'm trying to persist Borrow entity (book and borrower properties set to corresponding entities, then calling entityManager.persist(borrow); ) I've got in my logs:

Hibernate: insert into BORROW (BORROWER_ID, BOOK_ID, RETURN_DATE, BORROW_DATE) values (?, ?, ?, ?) // this insert statement is correct (that's a look of my table) Invalid value "5" for parameter "parameterIndex" [90008-174]

So it looks like someone is doing something wrong :) How to solve this? is my entity declaration faulty? (I wanted to use CompositeId to learn something about using it)

解决方案

Thanks to @JB nizet

@Id
@Column(name = "BOOK_ID", insertable = false, updatable = false)
private long bookId;

@Id
@Column(name = "BORROWER_ID", insertable = false, updatable = false)
private long borrowerId;

@MapsId("bookId")
@ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST,
                                              CascadeType.MERGE,
                                              CascadeType.REFRESH})
@JoinColumn(name = "BOOK_ID")
private Book book;

@MapsId("borrowerId")
@ManyToOne(fetch = FetchType.EAGER, cascade = {CascadeType.PERSIST, 
                                               CascadeType.MERGE,
                                               CascadeType.REFRESH})
@JoinColumn(name = "BORROWER_ID")
private Borrower borrower;

@Id
@Column(name = "BORROW_DATE")
private Date borrowDate;

Solves the problem, strange, because nowhere, in any example/tutorial there was no @MapsId used with @IdClass. I'm not sure if now @JoinColumn is needed

这篇关于JPA / Hibernate尝试在复合标识实体中存储太多参数(以及加倍属性)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆