gpt4 book ai didi

java - .IdentifierGenerationException : null id generated for:class

转载 作者:行者123 更新时间:2023-11-29 05:09:21 32 4
gpt4 key购买 nike

我有以下表格:

@Entity
@Table(name = "CUSTOMER")
public class Customers implements Serializable {

private static final long serialVersionUID = -5419345600310440297L;
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "cust")
@SequenceGenerator(name = "cust", sequenceName = "cust_ID_SEQ")
@Column(name = "CUSTOMER_ID")
private Long id;
@Column(name = "NAME")
private String name;
@OneToMany(mappedBy = "customer", cascade = CascadeType.PERSIST)
private Set<CustomerDeal> customerDeals;

//getters and setters goes here ....
}

@Entity
@Table(name = "DEALS")
public class Deals implements Serializable {

private static final long serialVersionUID = -7197428343863081750L;

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "deals_seq")
@SequenceGenerator(name = "deals_seq", sequenceName = "DEALS_SEQ")
@Column(name = "DEAL_ID")
private Long dealId;

@Column(name = "DEAL_NAME")
private String dealColName;

//getters setters
}

@Entity
@Table(name = "CUSTOMER_DEALS")
public class CustomerDeals implements Serializable {
private static final long serialVersionUID = -4249326793843278525L;

@EmbeddedId
private CustomerDealId customerDealId;

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "CUSTOMER_ID", insertable = false, updatable = false)
private Customers customers;

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "DEAL_ID", insertable = false, updatable = false)
private Deals deals;

//getters setters

}

@Embeddable
public class CustomerDealId implements Serializable {

private static final long serialVersionUID = 9086627167426987610L;

@Column(name = "DEAL_ID")
private Long dealId;

@Column(name = "CUSTOMER_ID")
private Long customerId;

}

但是当我尝试创建新客户时

Customer cust - new Customer ()
cust.setName("Foo")
CustomerDeals custDeals = new CustomerDeals()
Set<CustomerDeal> custDealsSet = new HashSet<CustomerDeal>
CustomerDeal custDealsSet1 = new CustomerDeal()
CustomerDeal custDealsSet2 = new CustomerDeal()
custDealsSet1.setDeals(dealsRepository.findOne(1))//getting existing deal
custDealsSet1.customers(cust)
custDealsSet2.setDeals(dealsRepository.findOne(2))//getting existing deal
custDealsSet2.customers(cust)
custDealsSet.add(custDealsSet1)
custDealsSet.add(custDealsSet2)
cust.setCustomerDeals(custDealsSet)
customerRepository.saveAndFlush(cust)
customerRepository.saveAndFlush(cust)

我得到了

org.hibernate.id.IdentifierGenerationException: null id generated for:class CustomerDeal

这不是 this question 的复制

最佳答案

你抛出异常的代码没有意义,所以我猜它不是真正的代码。

CustomerDeal 具有复合键,因此您将无法使用 dealsRepository.findOne(1) 检索它,这意味着您可能正在检索 Deal 而不是 CustomerDeal,但该部分将永远不会编译:

Set<CustomerDeal>  custDealsSet = new HashSet<CustomerDeal>();
custDealsSet.add(dealsRepository.findOne(1))

因此,除此之外,我猜您正在检索现有交易。你结交了一个新客户。由于 CustomerDeal 的关键取决于客户和交易,因此必须在坚持之前设置客户和交易,而您可能忘记这样做(并且您有异常(exception))。所以它应该看起来像:

Customer cust - new Customer ();
cust.setName("Foo");

CustomerDeals custDeal = new CustomerDeals();
custDeal.setCustomer(cust);
custDeal.setDeal(dealsRepository.findOne(1));
cust.getCustomerDeals().add(custDeal);

custDeal = new CustomerDeals();
custDeal.setCustomer(cust);
custDeal.setDeal(dealsRepository.findOne(2));
cust.getCustomerDeals().add(custDeal);

customerRepository.saveAndFlush(cust);

现在您可能仍然有麻烦。如果您覆盖 CustomerDeal 上的 equals 和散列,使它们基于 ID(实体的典型代码生成器就是这样做的),则两个新的 CustomerDeals 实例都将它们设为 null,因此当您将它们添加到集合中时,第二个将覆盖第一个插入的 (因为 null id 将等于)。

您还需要通知 JPA ID 将来自关系。在您的 CustomerDea 中,您需要添加 @MapsId 注释(在两个连接上),例如:

@MapsId("customerId")
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "CUSTOMER_ID", insertable = false, updatable = false)
private Customers customers;

最后,除非您的 CustomerDeal 表包含除 CUSTOMER_ID 和 Deal_ID 之外的其他内容,否则它是一个简单的联合表,根本不应该映射。这样你就可以省去很多麻烦。

关于java - .IdentifierGenerationException : null id generated for:class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29227269/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com