Spring Data Rest在更新关系时合并数据

时间:2017-08-08 19:53:10

标签: java spring hibernate one-to-many spring-data-rest

我在项目中使用Spring Data REST,编辑主实体时遇到关系问题。 这是我的模型的简单版本:

@MappedSuperclass
public abstract class AbstractEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    // Getters and setters
}

@Entity
public class Player extends AbstractEntity {

    private String category;

    private String fnuCode;

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
    @JoinTable(name = "player_contact", joinColumns = @JoinColumn(name = "id_player"), inverseJoinColumns = @JoinColumn(name = "id_contact"))
    private List<Contact> contacts;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "id_person")
    private Person person;

    // Getters and setters
}

@Entity
public class Contact extends AbstractEntity {

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "id_person")
    private Person person;

    private String relationship;

    // Getters and setters
}

@Entity
public class Person extends AbstractEntity {

    private String name;

    private String lastname;

    private String idCard;

    // Getters and setters
}

然后,我有 PlayerRepository

@RepositoryRestResource(path = "players", excerptProjection = PlayerList.class)
@CrossOrigin(origins = "http://localhost:8081")
public interface PlayerRepository extends PagingAndSortingRepository<Player, Long> {

}

PlayerDetail 是我在查看和编辑播放器时使用的投影:

@Projection(name = "playerdetail", types = { Player.class })
public interface PlayerDetail {

    @Value("#{target.person.name} #{target.person.lastname}")
    String getFullName();

    @Value("#{target.person.idCard}")
    String getIdCard();

    @Value("#{target.category}")
    String getCategory();

    @Value("#{target.fnuCode}")
    String getFnuCode();

    List<Contact> getContacts();
}

我没有任何联系人资源库,因为他们被创建并修改为播放器上下文。

这是一个示例json响应当我想编辑或查看播放器的详细信息(该对象是从playerdetail投影生成)时我得到的:

{
 "idCard" : "12365478",
 "fnuCode" : "1111",
  "contacts" : [ {
    "person" : {
      "name" : "Roberto",
      "lastname" : "Perez",
      "idCard" : null
    },
    "relationship" : "Father"
  }, {
    "person" : {
      "name" : "Lucia",
      "lastname" : "Perez",
      "idCard" : null
    },
    "relationship" : "Sister"
  } ],
  "fullName" : "Juancito Perez",
  "category" : "U19",
  "_links" : {
    "self" : {
      "href" : "http://localhost:8080/players/171"
    },
    "jugador" : {
      "href" : "http://localhost:8080/players/171{?projection}",
      "templated" : true
    }
  }
}

当我编辑播放器并删除列表的第一个联系人时出现问题,在本例中为“Roberto Perez”。结果,在数据库中删除了Lucia Perez的行,并将其数据合并到Roberto Perez行中。 在删除第一个联系人之前,我在DB中有以下数据:

Table: contact
id  |id_person  |relationship   |
175 |176        |Father         |  --> First contact (Roberto)
178 |179        |Sister         |  --> Second contact (Lucia)

Table: person
id  |id_card    |lastname   |name
176 |null       |Perez      |Roberto
179 |null       |Perez      |Lucia

删除第一次联系(Roberto)后,我有:

Table: contact
id  |id_person  |relationship
175 |176        |Sister

Table: person
id  |id_card    |lastname   |name
176 |null       |Perez      |Lucia

请注意第二个联系人的ID已更改。它应该是178而不是175。

预期结果

Table: contact
id  |id_person  |relationship
178 |179        |Sister 

Table: person
id  |id_card    |lastname   |name
179 |null       |Perez      |Lucia

第二个联系人应保留其ID。

我认为Spring Data REST合并了联系人信息,因为没有单一的方法来识别每个联系人,因为id未在投影中公开。

我需要一种防止联系人合并的方法。在Spring Data REST中是否还有其他管理集合和关系的方法?

0 个答案:

没有答案