|
When joining two entities on a non-primary-key-field, I get
org.hibernate.MappingException: Repeated column in mapping for entity: etc...
errors, if the target field is in an embeddable but it works otherwise. For example, the following does not work:
@Entity
@Table(name = "thing")
public class Thing implements Serializable {
@Id
@GeneratedValue(strategy = IDENTITY)
private Integer id;
public Integer getId() {
return id;
}
@Embedded
private UniqueField uniqueField;
public UniqueField getUniqueField() {
return uniqueField;
}
public void setUniqueField(UniqueField uniqueField) {
this.uniqueField = uniqueField;
}
}
@Embeddable
public class UniqueField {
@Column(name = "unique_field", length=50, nullable=false)
private String value;
public UniqueField() {}
public UniqueField(String value) {
super();
this.value = value;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
@Entity
@Table(name="more_to_it")
public class MoreToIt {
@Id
@GeneratedValue(strategy = IDENTITY)
private Integer id;
public Integer getId() {
return id;
}
@Column(name="data",length=300)
private String data;
public void setData(String data) {
this.data = data;
}
public String getData() {
return data;
}
@ManyToOne
@JoinColumn(name="unique_thing", referencedColumnName="unique_field", updatable=false, insertable=false)
private Thing thing;
@Column(name="unique_thing")
private String uniqueThing;
public Thing getThing() {
return thing;
}
public void setThing(Thing thing) {
this.thing = thing;
}
public void setUniqueThing(String uniqueThing) {
this.uniqueThing = uniqueThing;
}
public String getUniqueThing() {
return uniqueThing;
}
}
Note the embedded UniqueField and the JoinColumn use in MoreToIt.
But, if adding the field "uniqueField" flat into Thing, it works:
@Entity
@Table(name = "thing")
public class Thing implements Serializable {
@Id
@GeneratedValue(strategy = IDENTITY)
private Integer id;
public Integer getId() {
return id;
}
@Column(name = "unique_field", length = 50, nullable = false)
private String uniqueField;
public String getUniqueField() {
return uniqueField;
}
public void setUniqueField(String uniqueField) {
this.uniqueField = uniqueField;
}
}
/* no changes in MoreToIt */
This may be related to
HHH-4284
but is even clearer as a case.
|