Orm 自动增量id未反映在使用JPA的复合密钥中

Orm 自动增量id未反映在使用JPA的复合密钥中,orm,jpa,eclipselink,Orm,Jpa,Eclipselink,我有一张下面的地图 @Entity @Table(name = "auctions") public class Auction{ . . @OneToMany(cascade = CascadeType.ALL, mappedBy = "auction") private List<AuctionParamValue> auctionParamValueList; . . } @Entity @Table(name = "auction_param_values

我有一张下面的地图

@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 @MapsId("auctionParamId")
        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")
       @Nullable
       private Long auctionId = null;

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

@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;
 }
此处,[auctionId=0始终作为0提交,而不是最后插入的id:(


此映射有什么问题?

您可以尝试两种方法:

  • 使这两个ID为空:使用包装类型而不是原语(整数,长),并在保存之前将其设置为空
  • 保存组合主ID字段(auctionParamValuePK)时,将其保留为空(null)

我不知道这是否能解决问题,但我确信您至少需要执行其中一项操作才能使其正常工作。

如果您在其他类中有其他属性引用您负责设置的id,则@GeneratedValue只会设置其注释的属性的值

i、 e.您需要首先持久化并刷新拍卖,然后使用其generate Id创建AuctionParamValue

或者,如果您使用表或序列id生成,那么您只需要调用persist,而不是flush。一般来说,我不建议使用标识排序,因为它的值不能预先分配

但实际上,您不应该像所有字段一样拥有重复字段。完全删除@EmbeddedId auctionParamValuePK,只需将@Id添加到两个@ManyTone中,并使用@IdClass即可。这将使事情变得更加简单,即使生成标识Id,也可以正常工作

您也可以删除两个@ManyToOne映射上的insertable/updateable=false,而将它们放在@EmbeddedId属性上,这将从关系中写入外键,但您的对象仍将在内存中损坏

看,,

我尝试了这两种方法,第一点在帖子中被更新(问题),现在我在插入查询中得到的拍卖id和拍卖参数id都为null。我还有什么地方做错了吗?@Sourabh:您的数据库列是自动增量列吗?
Internal Exception: com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (`portaldemo`.`auction_param_values`, CONSTRAINT `auction_param_values_auction_id_fk` FOREIGN KEY (`auction_id`) REFERENCES `auctions` (`auction_id`))
Error Code: 1452
Call: INSERT INTO auction_param_values (auction_param_val, create_ts, last_updt_ts, auction_param_id, auction_id) VALUES (?, ?, ?, ?, ?)
    bind => [2011-02-12 04:00:00, 2011-01-27 12:02:00.28, 2011-01-27 12:17:43.25, 2, 0]
Query: InsertObjectQuery(com.eaportal.domain.AuctionParamValue[auctionParamValuePK=com.eaportal.domain.AuctionParamValuePK[auctionId=0, auctionParamId=2]])