私はかなり混乱しています。次のコードを使用して、データベースに 2 つの Customers が作成されている理由を見つけようとしていますが、うまくいきません。コードからすべてのノイズをカットしようとしましたが、問題の解決に重要なものを消去していないことを願っています。ここでは次の順序で表示されます: エンティティ、DAO、サービス、および偽の動作を保持するspecialTreatmentを持つSpecialService。
specialTreatmentの目的は、Customer がリンクされていない既存の Order を取得し、新しい Customer を作成して、それを Order に関連付けることです。
エンティティ :
Order.java :
@Entity
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "pk_id_order")
private Integer id;
// Other fields ...
@BatchFetch(value = BatchFetchType.IN)
@JoinColumn(name = "fk_id_customer", referencedColumnName = "pk_id_customer")
@ManyToOne(fetch = FetchType.LAZY, optional = false)
private Customer customer;
// Other fields ...
// Getter & setters for each field
@Override
public int hashCode() {
int hash = 7;
hash = 79 * hash + (this.id != null ? this.id.hashCode() : 0);
return hash;
}
@Override
public boolean equals(Object obj) {
if (obj == null || !(obj instanceof Order)) {
return false;
}
final Order other = (Order) obj;
if (this.id != other.id && (this.id == null || !this.id.equals(other.id))) {
return false;
}
return true;
}
}
Customer.java :
@Entity
public class Customer {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "pk_id_customer")
private Integer id;
// Other fields
@OrderBy(value = "createdAt DESC")
@OneToMany(mappedBy = "customer", fetch = FetchType.LAZY)
private List<Order> orders;
@Override
public int hashCode() {
return (id != null ? id.hashCode() : 0);
}
@Override
public boolean equals(Object object) {
if (object == null || !(object instanceof Customer)) {
return false;
}
final Customer other = (Customer) object;
if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
return false;
}
return true;
}
}
DAO :
@Repository
@Transactional
public class CustomerDao {
@PersistenceContext
protected EntityManager em;
public void create(Customer customer) {
this.em.persist(customer);
}
}
@Repository
@Transactional
public class OrderDao {
@PersistenceContext
protected EntityManager em;
public Order edit(Order order) {
return this.em.merge(order);
}
}
サービス :
@Service
@Transactional
public class CustomerService {
@Autowired
private CustomerDao customerDao;
public void create(Customer customer) {
this.customerDao.create(customer);
}
}
@Service
@Transactional
public class OrderService {
@Autowired
private OrderDao orderDao;
public void edit(Order order) {
this.orderDao.edit(order);
}
}
@Service
@Transactional
public class SpecialService {
@Autowired
private CustomerService customerService;
@Autowired
private OrderService orderService;
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void specialTreatment(Order order) {
Customer customer = new Customer();
// Fill customer ...
this.customerService.create(customer); // LINE X
order.setCustomer(customer); // LINE Y
this.orderService.edit(order);
}
}
注 : 行 X にコメントする場合: - 顧客が作成されていない (予想どおり)、注文は予想どおりに編集されます 行 Y にコメントする場合: - 顧客は予想どおりに作成されます (1 行のみ) が、注文にリンクされていません
コードは Spring MVC コントローラーから呼び出されます
何かアドバイス ?