Spring JPA将实体复制到另一个具有相同列的表

mitkmikd  于 8个月前  发布在  Spring
关注(0)|答案(2)|浏览(97)

我想从表A复制一个条目到表B。表AB具有相同的列。
要做到这一点,我需要两个Java实体:

@Entity
@Table(name = "A")
public class TableA{
   @Id 
   @GeneratedValue
   @SequenceGenerator(name="my_seq",sequenceName="MY_SEQ", allocationSize=1)
   @Column(name = "id")
   private int id;
}

@Entity
@Table(name = "B")
public class TableB{
   @Id
   @Column(name = "id")
   private int id;
}

然后将每个值从AMap到B

@PreRemove
public void insertIntoB(TableA tableA) {
   TableB tableB = new TableB();
   tableB.setId(tableA.getId());
   tableBRepository.save(tableB);
}

当表AB只有1列时,这种方法很好,但在我的情况下,我使用的是50多列,所以insertIntoB方法将是巨大的。此外,我还必须使用这种方法维护两个Java实体,因为如果对表A进行了更改,那么这些更改也必须反映在表B实体中。每次向表A添加新列后,insertIntoB也必须更改。
我如何才能使这个解决方案更优雅?有没有办法为两个表共享一个实体对象,或者将值从A自动Map到B?请考虑表A使用SequenceGenerator,而表B仅使用从表A传递的id

6tr1vspr

6tr1vspr1#

请使用Mapstruct库,它非常适合这项工作。

@Mapper(
    componentModel = "spring",
    nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS,
    nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE)
public interface AgencyLocationMapper {

  // Map table A to table B
  TableB mapToTableB(TableA tableA);

}
00jrzges

00jrzges2#

使用ORM,我想我会简单地使用标准的JPA @Embedded@Embeddable注解来重用某些Map,这些Map会重复出现,并且在使用两个单独的实体时对绑定有意义。
然后,您可以手动Map实体(这是我个人的偏好,因为一些手动的一次性劳动没有什么错),或者使用像MapStruct这样的反射库来尝试减轻Map时的痛苦,直到它不完全符合您的期望,然后您花20分钟调试这个东西。

相关问题