我有两个实体,一个州和一个位置。一个国家可以有许多地方。 这种映射应该非常简单。
@Entity
@Table(name="Locations")
public class Location {
public Location() {};
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
@ManyToOne
@JoinColumn(name="StateCode")
private State state;
}
和州级:
@Entity
@Table(name="States")
public class State {
private static final Logger log = LoggerFactory.getLogger(State.class);
public State() {
locations = new ArrayList<Location>();
};
@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER, mappedBy="location")
private Collection<Location> locations;
@Id
@Column(name="StateCode", nullable=false, length=6)
private String stateCode;
public Collection<Location> getLocations() {
return locations;
}
public void setLocations( Collection<Location> locations ) {
this.locations = locations;
}
public String getStateCode() {
return stateCode;
}
public void setStateCode(String code) {
this.stateCode = code;
}
然而我收到此错误: AnnotationException mappedBy引用未知的目标实体属性:net.rallaesystems.vibracheck.model.State.locations中的net.rallaesystems.vibracheck.model.Location.location
我遵循了将映射更改为“州”字段的建议。使用此代码,但
@Repository
public interface StateRepository extends CrudRepository<State, String>{
List<State> findAll();
}
在一个简单的控制器中调用,状态的序列化进入无限循环。也许序列化库存在问题?我认为是杰克逊。
答案 0 :(得分:0)
您应该将@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER, mappedBy="location")
更新为@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER, mappedBy="state")
,这表明州是所有者
state
类
Location
的位置
@ManyToOne
@JoinColumn(name="StateCode")
private State state;
答案 1 :(得分:0)
是的,正如有人回答的那样,你需要使用Location的有效属性,它是位置表上的外键(这里是location类的state属性,statecode是location表中的外键)。