我在项目中使用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中是否还有其他管理集合和关系的方法?