簡體   English   中英

持久后,多個相同類型的@Embedded字段始終為null

[英]Multiple @Embedded fields of same type are always null after persisting

我實現了以下層次結構:

Abstract Superclass: ConnectionTechnologyDetails
Subclass: AS2
Embeddable: AS2Details

與父類相比,子類AS2具有其他屬性和方法。 其他屬性是AS2Details的@Embedded類型。

當我將AS2子類實例保存到其存儲庫時,@ Embedded字段似乎丟失了。 當我保護已保存的實例時,所有@Embedded字段都為null 我不知道為什么,因為在保存到資源庫之前進行打印會導致填充的@Embedded字段。

堅持后的結果

  "connectionTechnologyDetails": {
        "id": 2,
        "connectionTechnologyName": "AS2",
        "senderReceiverIds": {
            "senderIDOutbound": "HLCU",
            "receiverIDOutbound": "BASF",
            "senderIdInbound": "BASF",
            "receiverIdInbound": "HLCU"
        },
        "companyTestDetails": null,
        "companyProdDetails": null,
        "hlagTestDetails": null,
        "hlagProdDetails": null,
        "testString": "testStringShowsUp"
    }

連接技術詳細信息

import javax.persistence.*;
import javax.validation.constraints.NotNull;
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(discriminatorType = DiscriminatorType.STRING, name = "TECH_TYPE")
public abstract class ConnectionTechnologyDetails {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@OneToOne
@PrimaryKeyJoinColumn
private Connection connection;

@NotNull
private ConnectionTechnologyName connectionTechnologyName;

@Embedded
private SenderReceiverIds senderReceiverIds;

public ConnectionTechnologyDetails(ConnectionTechnologyName connectionTechnologyName, SenderReceiverIds senderReceiverIds) {
    this.connectionTechnologyName = connectionTechnologyName;
    this.senderReceiverIds = senderReceiverIds;
}

public ConnectionTechnologyDetails() {

}

public ConnectionTechnologyName getConnectionTechnologyName() {
    return connectionTechnologyName;
}

public void setConnectionTechnologyName(ConnectionTechnologyName connectionTechnologyName) {
    this.connectionTechnologyName = connectionTechnologyName;
}

public SenderReceiverIds getSenderReceiverIds() {
    return senderReceiverIds;
}

public void setSenderReceiverIds(SenderReceiverIds senderReceiverIds) {
    this.senderReceiverIds = senderReceiverIds;
}

public Long getId() {
    return id;
}

public void setId(Long id) {
    this.id = id;
}

public enum ConnectionTechnologyName {
    SMTP,
    AS2,
    UNSECURE_FTP,
    SECURE_FTP,
    FTP_SECURE
}

@Override
public String toString() {
    return "ConnectionTechnologyDetails: Name=" +getConnectionTechnologyName().name()
            + " SenderReceiverIds=" + getSenderReceiverIds();
}

}

AS2

(甚至嘗試對第一個@Embedded字段進行硬編碼。但是,即使這樣也不起作用。)

import javax.persistence.*;
import javax.validation.constraints.NotNull;

@Entity(name = "AS2")
@Table(name = "AS2")
@DiscriminatorValue("AS2")
public class AS2 extends ConnectionTechnologyDetails {
    @NotNull
    @Embedded
    private AS2Details companyTestDetails = new AS2Details("192.1.168.1",
            "ctest", "localhost:8080", "ctest2", "90", "111.00.5.4",
            "scharpe", "+9+992++*9*+", "AS3");
    @NotNull
    @Embedded
    private AS2Details companyProdDetails;
    @NotNull
    @Embedded
    private AS2Details hlagTestDetails;
    @NotNull
    @Embedded
    private AS2Details hlagProdDetails;
    private String testString;

    public AS2(ConnectionTechnologyName connectionTechnologyName, SenderReceiverIds senderReceiverIds,
               AS2Details companyTestDetails, AS2Details companyProdDetails, AS2Details hlagTestDetails,
               AS2Details hlagProdDetails) {
        super(connectionTechnologyName, senderReceiverIds);
        System.err.println("ERROR---- companyTestDetails = " + companyTestDetails);
        this.companyTestDetails = companyTestDetails;
        this.companyProdDetails = companyProdDetails;
        this.hlagTestDetails = hlagTestDetails;
        this.hlagProdDetails = hlagProdDetails;
        testString = "testStringShowsUp";
    }

    public AS2() {
        super();
    }


    public void setHlagProdDetails(AS2Details hlagProdDetails) {
        this.hlagProdDetails = hlagProdDetails;
    }

    @Override
    public String toString() {
        return "AS2 Technology: Company: " + getCompanyTestDetails() + " / " + getCompanyProdDetails() + " HLAG: " +
                getHlagTestDetails() + " " + getHlagTestDetails() + getTestString();
    }

    public AS2Details getCompanyTestDetails() {
        return companyTestDetails;
    }

    public void setCompanyTestDetails(AS2Details companyTestDetails) {
        this.companyTestDetails = companyTestDetails;
    }

    public AS2Details getCompanyProdDetails() {
        return companyProdDetails;
    }

    public void setCompanyProdDetails(AS2Details companyProdDetails) {
        this.companyProdDetails = companyProdDetails;
    }

    public AS2Details getHlagTestDetails() {
        return hlagTestDetails;
    }

    public void setHlagTestDetails(AS2Details hlagTestDetails) {
        this.hlagTestDetails = hlagTestDetails;
    }

    public AS2Details getHlagProdDetails() {
        return hlagProdDetails;
    }

    public String getTestString() {
        return testString;
    }

    public void setTestString(String testString) {
        this.testString = testString;
    }
}

AS2詳細信息

import javax.persistence.Column;
import javax.persistence.Embeddable;

public class AS2Details {
    @Column(name = "ip1", insertable = false, updatable = false)
    private String ip1;
    @Column(name = "as1id1", insertable = false, updatable = false)
    private String AS2ID1;
    @Column(name = "url", insertable = false, updatable = false)
    private String url;
    @Column(name = "as2id2", insertable = false, updatable = false)
    private String AS2ID2;
    @Column(name = "port", insertable = false, updatable = false)
    private String port;
    @Column(name = "ip2", insertable = false, updatable = false)
    private String ip2;
    @Column(name = "as2sofware", insertable = false, updatable = false)
    private String AS2Software;
    @Column(name = "userid", insertable = false, updatable = false)
    private String userId;
    @Column(name = "password", insertable = false, updatable = false)
    private String password;

    public AS2Details(String ip1, String AS2ID1, String url, String AS2ID2,
                      String port, String ip2, String userId, String password, String AS2Software) {
        this.ip1 = ip1;
        this.AS2ID1 = AS2ID1;
        this.url = url;
        this.AS2ID2 = AS2ID2;
        this.port = port;
        this.ip2 = ip2;
        this.userId = userId;
        this.password = password;
        this.AS2Software = AS2Software;
    }

    public AS2Details() {

    }

    public String getIp1() {
        return ip1;
    }

    public void setIp1(String ip1) {
        this.ip1 = ip1;
    }

    public String getAS2ID1() {
        return AS2ID1;
    }

    public void setAS2ID1(String AS2ID1) {
        this.AS2ID1 = AS2ID1;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getAS2ID2() {
        return AS2ID2;
    }

    public void setAS2ID2(String AS2ID2) {
        this.AS2ID2 = AS2ID2;
    }

    public String getPort() {
        return port;
    }

    public void setPort(String port) {
        this.port = port;
    }

    public String getIp2() {
        return ip2;
    }

    public void setIp2(String ip2) {
        this.ip2 = ip2;
    }

    public String getAS2Software() {
        return AS2Software;
    }

    public void setAS2Software(String AS2Software) {
        this.AS2Software = AS2Software;
    }

    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "AS2 Details: " + getAS2ID1() + getAS2ID2() + getIp1() + getIp2() + getPassword();
    }
}

在CommandLineRunner中創建數據

    AS2Details companyTestDetails = new AS2Details("192.1.168.1",
            "ctest", "localhost:8080", "ctest2", "90", "111.00.5.4",
            "scharpe", "+9+992++*9*+", "AS3");
    AS2Details companyProdDetails = new AS2Details("192.1.168.1",
            "cp", "localhost:8080", "cp", "90", "111.00.5.4",
            "scharpe", "+9+992++*9*+", "AS3");
    AS2Details hlagTestDetails = new AS2Details("192.1.168.1",
            "htest1", "localhost:8080", "htest2", "90", "111.00.5.4",
            "scharpe", "+9+992++*9*+", "AS3");
    AS2Details hlagProdDetails = new AS2Details("192.1.168.1",
            "hp1", "localhost:8080", "hp2", "90", "111.00.5.4",
            "scharpe", "+9+992++*9*+", "AS3");

    AS2 as2 = connectionTechnologyDetailsRepository.save(new AS2(ConnectionTechnologyDetails
            .ConnectionTechnologyName.AS2, senderReceiverIds,
            companyTestDetails, companyProdDetails, hlagTestDetails, new AS2Details()));

    logger.info("CommandLineRunner: connectionTechnology AS2: " + as2.toString());
    Connection userAs2Connection = new Connection(userRepository.findByUsername("userman").get(),
            contactDetailsRepository.findFirstByOrderByIdAsc(),
            BusinessCase.CONSIGNEE,
            as2);
    connectionRepository.save(userAs2Connection);

為什么嵌入式字段為null,而超類的字段卻被填充? 當我從子類的構造函數中打印字段時,數據正確存在。 但是它不會從構造函數中保存到嵌入式字段中。

由我自己解決。

如果映射相同類型 (AS2Details)的多個@Embedded字段,則必須覆蓋它們的屬性。 否則,您的表中將發生名稱沖突,因為多個列將具有相同的名稱。 例如,在這種情況下,您將在同一張單個表中包含列URL和列URL。

因此,我向AS2類中的每個嵌入式字段添加了onverride注釋。 例如第一個字段:

    @Embedded
    @AttributeOverrides({
        @AttributeOverride(name="ip1", column=@Column(name="companyTestDetails_ip1")),
        @AttributeOverride(name="AS2ID1", column=@Column(name="companyTestDetails_as2id1")),
        @AttributeOverride(name="url", column=@Column(name="companyTestDetails_url")),
        @AttributeOverride(name="AS2ID2", column=@Column(name="companyTestDetails_as2id2")),
        @AttributeOverride(name="port", column=@Column(name="companyTestDetails_port")),
        @AttributeOverride(name="ip2", column=@Column(name="companyTestDetails_ip2")),
        @AttributeOverride(name="userId", column=@Column(name="companyTestDetails_userId")),
        @AttributeOverride(name="password", column=@Column(name="companyTestDetails_password")),
        @AttributeOverride(name="AS2Software", column=@Column(name="companyTestDetails_as2software"))
})
private AS2Details companyTestDetails;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM