【问题标题】:Netbeans - Glassfish server deployment error due to composite primary keyNetbeans - 由于复合主键导致 Glassfish 服务器部署错误
【发布时间】:2013-10-04 11:24:31
【问题描述】:

在将我的 Netbeans 项目部署到 Glassfish 服务器时,我目前遇到了 BUILD FAILED 错误的问题。我从日志中得到以下错误:

异常描述:来自实体类 [class entity.InstrumentExtRef] 的注释元素 [field instrument] 上的 @JoinColumns 不完整。当源实体类使用复合主键时,必须使用@JoinColumns 为每个连接列指定@JoinColumn。 name 和 referencedColumnName 元素都必须在每个这样的 @JoinColumn 中指定。有关详细信息,请参阅 server.log。

有问题的表是 instrument_ext_ref 并且具有以下字段的复合主键:instrument_id 和 instrument_code_type。

似乎有问题的实体类——InstrumentExtRef——有以下声明和注解。

@EmbeddedId
protected InstrumentExtRefPK instrumentExtRefPK;
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 16)
@Column(name = "reference")
private String reference;
@JoinColumn(name = "instrument_code_type", referencedColumnName = "code_type", insertable = false, updatable = false)
@ManyToOne(optional = false)
private InstrumentCodeType instrumentCodeType1;
@JoinColumn(name = "instrument_id", referencedColumnName = "id", insertable = false, updatable = false)
@ManyToOne(optional = false)
private Instrument instrument;

包含@EmbeddedId 详细信息的实体类(InstrumentExtRefPK)如下所示:

@Embeddable
public class InstrumentExtRefPK implements Serializable {
@Basic(optional = false)
@NotNull
@Column(name = "instrument_id")
private int instrumentId;
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 10)
@Column(name = "instrument_code_type")
private String instrumentCodeType;

类 InstrumentCodeType 是指表 instrument_code_type,它有一个主键 code_type(被引用的列)。类 Instrument 是指 table Instrument,它本身具有由列“id”(引用列)和列“exchange_exchange_code”组成的复合主键。

从错误消息中可以明显看出 InstrumentExtRef 实体中的复合主键是问题,但根据我对其他类似(但不完全相同)问题的研究,我认为我的实体类看起来不错。但我对此比较陌生,可能会遗漏一些东西。

【问题讨论】:

    标签: java jpa deployment glassfish netbeans-7


    【解决方案1】:

    在对实体类中复合键的创建/使用进行了更多研究之后,我在收到的错误消息中发现了一个微妙的点。

    "...必须使用 @JoinColumn*s*" 为每个连接列指定。我没有使用 @JoinColumns 注释。或者至少 Netbeans 没有那样创建实体类。可能是因为每个连接列都来自不同的源实体/表。

    如下更正我的实体类后,项目能够成功部署。

        @JoinColumns({
        @JoinColumn(name = "instrument_code_type", referencedColumnName = "code_type",    insertable = false, updatable = false),
        @JoinColumn(name = "instrument_id", referencedColumnName = "id", insertable = false, updatable = false)})
    private InstrumentCodeType instrumentCodeType1;
    private Instrument instrument;
    

    正是在这里,我开始看到问题可能出在哪里: https://access.redhat.com/site/documentation/en-US/JBoss_Enterprise_Application_Platform/5/html/Hibernate_Annotations_Reference_Guide/ch02s02s06.html

    我怀疑我的下一个问题与复合主键由来自两个不同实体(仪器和仪器代码类型)的列组成的事实有关。但目前,上述更改让我克服了构建问题,如果出现下一个问题,我将单独处理。

    【讨论】:

      猜你喜欢
      • 2013-12-15
      • 2017-07-23
      • 1970-01-01
      • 2016-01-28
      • 1970-01-01
      • 1970-01-01
      • 2018-04-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多