Необходимо понимать поведение Java 8 для создания объектов и обновления ссылки - PullRequest
0 голосов
/ 05 июля 2018

Мне не удалось понять следующую проблему. У меня есть один файл DTO следующим образом. ClientRegistrationDTO.java

public class ClientRegistrationDTO {    
    private Long clientId;

    private String clientCode;

    private String clientName;

    private String url;

    private String logo;

    private Long languageId;

    private String timeZone;

    //contact details   
    private Set<Address> addresses;
    private Set<ContactDetails> contactDetails;

    public ClientRegistrationDTO(){}

    public ClientRegistrationDTO(Set<Address> addressSet,Set<ContactDetails> contactDetails){
        this.addresses = addressSet;
        this.contactDetails = contactDetails;
    }   

}

Таким образом, у меня есть метод registerClient, который принимает этот файл DTO для работы над сохранением client, а также user. Следующим образом

    public ClientRagistrationResponce registerClient(
            ClientRegistrationDTO clientRegistrationDTO) {
        ClientRagistrationResponce clientInfo = null; 
        if (clientRegistrationDTO != null) {
            clientInfo = new ClientRagistrationResponce(); // creating responce variable

            //setting another ragisterDTO file with default value 
            ClientRegistrationDTO clientRegistrationDTO2 = new 
Line no 9   ClientRegistrationDTO(clientRegistrationDTO.getAddresses(),clientRegistrationDTO.getContactDetails());



            // creating addresses Set from clientRegistrationDTO to insert
            // against user.
Line no 15  Set<Address> clientAddress = new HashSet<>(clientRegistrationDTO.getAddresses());
Line no 16  Set<ContactDetails> clientContactDetails =  new HashSet<>(clientRegistrationDTO.getContactDetails());

Line no 18  Set<Address> userAddress =  new HashSet<>(clientRegistrationDTO2.getAddresses());
Line no 19  Set<ContactDetails> userContactDetails =  new HashSet<>(clientRegistrationDTO2.getContactDetails());

            // Save the client
            Client client = saveClient(clientRegistrationDTO);

            // Save the contact info
            ContactInfo clientContactInfo = saveContactInfo(
                    client.getClientId(), RDHCoreConstants.CONTACT_TYPE_CLIENT);

            // Save client addresses
Line no 29  Set<Address> clientAddressSet = saveClientAddresses(
                    clientContactInfo.getContactInfoId(), clientAddress);

            // Save Client contact details
Line no 33  Set<ContactDetails> clientContactDetailsSet = saveClientContactDetails(
                    clientContactInfo.getContactInfoId(), clientContactDetails);

            // save user
            User user = saveUser(clientRegistrationDTO);

            // Save User contact info
            ContactInfo userContactInfo = saveContactInfo(user.getUserId(),
                    RDHCoreConstants.CONTACT_TYPE_USER);

            // Save User addresses
            saveUserAddresses(userContactInfo.getContactInfoId(), userAddress);

            // Save User contact details
            saveUserContactDetails(userContactInfo.getContactInfoId(),
                    userContactDetails);

            saveClientUser(client.getClientId(), user.getUserId());

            // setting the return DTO
            clientInfo.setClientId(client.getClientId());
            clientInfo.setAddresses(clientAddressSet);
            clientInfo.setContactDetails(clientContactDetailsSet);
        }

        return clientInfo;
    }

Сначала я создал еще один объект с другим именем того же типа, чтобы установить адрес и контактные данные в безопасности при обновлении. @Line no 9.

Так что теперь, когда клиент Адрес & ContactDetails сохранен @ line no 29 & 33., он обновляет адрес в файле ClientRagistrationDTO.java и всю ссылку, которую я передал, чтобы создать еще один набор Адрес и contactDetails . @ Line no 9.

Я запутался, почему он обновляет все свои ссылки, хотя я никогда не обновлял их.

Пожалуйста, ведите меня шаг за шагом.

Примечание : Я использовал JPA Spring Data со следующим соотношением ContactInfo Таблица имеет contactInfoId как primary_key . который Foreign_key в Address, а также ContactDetails.

Follwing является сущностью таблиц. ContactInfo

@Entity
@Table(name = "contactinfo", schema = "test")
public @Data class ContactInfo {
    @Id
    @Column(name = "CONTACTINFOID")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long contactInfoId;

    @Column(name="CLIENTUSERID")
    private Long clientUserId;

    @Column(name = "CONTACTTYPE")
    @NotNull
    @Size(min = 1, max = 10)
    private String contactType;

}

Follwing является адресом

@Entity
@Table(name = "address", schema = "test")
public class Address {
    @Id
    @Column(name = "ADDRESSID")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long addressId;

    @Column(name = "ADDRESS1")
    @Size(min = 1, max = 50)
    private String address1;

    @Column(name = "ADDRESS2")
    @Size(min = 1, max = 50)
    private String address2;

    @Column(name = "CITY")
    @Size(min = 1, max = 50)
    private String city;

    @Column(name = "ZIP")
    @Size(min = 1, max = 15)
    private String zip;

    @Column(name = "STATE")
    @Size(min = 1, max = 50)
    private String state;

    @Column(name = "COUNTRY")
    @Size(min = 1, max = 50)
    private String country;

    @Column(name = "ISPRIMARY")
    @NotNull
    @Size(min = 1, max = 1)
    private String isPrimary;


    @Column(name = "CONTACTINFOID")
    private Long contactInfoId;


}

Follwing - КонтактДетали.

@Entity
@Table(name = "contactdetails", schema = "test")
public class ContactDetails {
    @Id
    @Column(name = "CONTACTDETAILSID")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long contactId;

    @Column(name = "CONTACTTYPE")
    @NotNull
    @Size(min = 1, max = 20)
    private String contactType;

    @Column(name = "CONTACTDETAIL")
    @NotNull
    @Size(min = 1, max = 20)
    private String contactDetail;

    @Column(name = "EXTENSION")
    private String extension;

    @Column(name = "ISPRIMARY")
    @NotNull
    @Size(min = 1, max = 1)
    private String isPrimary;

    @Column(name = "CONTACTINFOID")
    private Long contactInfoId;
}

Надеюсь, что для решения этой проблемы предоставлено достаточно информации.

...