Проблема сопоставления JPA с составным ключом - PullRequest
3 голосов
/ 25 января 2011

У меня есть отображение ниже

@Entity
@Table(name = "auctions")
public class Auction{
.
.
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "auction")
    private List<AuctionParamValue> auctionParamValueList;
.
.
}


@Entity
@Table(name = "auction_param_values")
public class AuctionParamValue {

    @EmbeddedId
    protected AuctionParamValuePK auctionParamValuePK;

    @JoinColumn(name = "auction_param_id", referencedColumnName = "auction_param_id",updatable=false,insertable=false)
    @ManyToOne 
        private AuctionParam auctionParam;

    @JoinColumn(name = "auction_id", referencedColumnName  = "auction_id",updatable=false,insertable=false)
    @ManyToOne @MapsId("auctionId") 
        private Auction auction;
}

@Embeddable
public class AuctionParamValuePK {
    @Id 
    @Basic(optional = false)
    @Column(name = "auction_id")
    private long auctionId;

    @Id
    @Basic(optional = false)
    @Column(name = "auction_param_id")
    private int auctionParamId;
}

@Entity
@Table(name = "auction_params")    
public class AuctionParam {
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "auctionParam")
    private List<AuctionTypeParam> auctionTypeParamList;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "auctionParam")
    private List<AuctionParamValue> auctionParamValueList;
 }

}

Когда я пытаюсь сохранить аукцион, я получаю ошибку ниже

 Internal Exception: com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException: Column 'auction_param_id' cannot be null
Error Code: 1048
Call: INSERT INTO auction_param_values (auction_param_val, create_ts, last_updt_ts, auction_param_id, auction_id) VALUES (?, ?, ?, ?, ?)
    bind => [500, 2011-01-25 20:11:01.22, 2011-01-25 20:11:01.22, null, null]
Query: InsertObjectQuery(com.eaportal.domain.AuctionParamValue[auctionParamValuePK=null])
Jan 25, 2011 8:11:01 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet dispatcher threw exception
com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException: Column 'auction_param_id' cannot be null

1 Ответ

5 голосов
/ 25 января 2011

Для отношений Auction - AuctionParamValue вам необходимо сделать следующее:

@Entity @Table(name = "auctions") 
public class Auction {
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "auction")
    private List<AuctionParamValue> auctionParamValueList;
    ...
}   

@Entity @Table(name = "auction_param_values")
public class AuctionParamValue {
     @EmbeddedId
     protected AuctionParamValuePK auctionParamValuePK;

     @ManyToOne @MapsId("auctionId")
     private Auction auction;

     ...
}

Относительно AuctionParam Я не уверен, какие отношения вы хотите выразить.

Полный набор примеров сопоставлений *1010* (т.е. составных ключей с внешними ключами внутри них) можно найти в спецификации JPA 2.0 , раздел 2.4.1.3.

...