有人知道@JoinColumn注释中table属性的用法吗?我应该提供实际的表名还是实体名?

时间:2017-10-02 15:31:57

标签: java hibernate jpa annotations

我在使用@ManyToOne关系时遇到问题,因为我的外键和主键具有相同的名称,所以Hibernate正在考虑我映射为当前表的列名。 所以我想我会使用@JoinColumn注释的表属性,但它似乎不起作用。我为它提供了实际的价值表,但它没有采取。也尝试了类名。 以下是实体。您可以在两个表中看到PRJ_NBR相同。因此,当我尝试运行该项目时,我收到的错误如找不到预期的辅助表:没有HEAD可用

如果从@JoinColumn中删除 table 属性,我会收到错误 - 实体映射中的重复列:com.example.jpademo.Detail列:PRJ_NBR(应该映射) with insert =" false" update =" false")

@Entity(name="Head")
@Table(name = "HEAD")
public class QuoteHead {
@Id
@Column(name = "PRJ_NBR")
private Integer projNumber;
@Column(name = "CUS_SYS_ID")
private Integer cusSysId;
@OneToMany(mappedBy = "head", cascade = CascadeType.ALL, orphanRemoval = 
true)
private List<Detail> details = new ArrayList<Detail>();
}

@Entity
@Table(name = "DETAIL")
@JsonIgnoreProperties
public class Detail {
@Transient
private Integer projectNumber;
@Transient
private Integer itemNumber;
@Transient
private Integer sequenceNumber;

@ManyToOne
@JoinColumn(name = "PRJ_NBR", table = "HEAD")
private Head head;

@JsonIgnore
@EmbeddedId
private DetailCompositeId id;
}
@Embeddable
public class DetailCompositeId implements Serializable {
private static final long serialVersionUID = 1L;
@Column(name = "PRJ_NBR")
private Integer projectNumber;
@Column(name = "ITM_NBR")
private Integer itemNum;
@Column(name = "SEQ_NBR")
private Integer sequenceNumber;
}

2 个答案:

答案 0 :(得分:1)

删除&#39;表&#39;并尝试将insertable =&#34; false&#34; ,updatable =&#34; false&#34;然后我认为它应该工作

答案 1 :(得分:1)

您可以使用@MapsId注释。

请参阅此帖子:can someone please explain me @MapsId in hibernate?

您可以删除@JoinColumn映射中的@ManyToOne,并将其替换为@MapsId,如下所示:

@ManyToOne
@MapsId("projectNumber")
private Head head;