我的JPA问题很小。我有三个表(OTHER表在这里不相关,但我添加它只是为了解释为什么有没有PK的表USERS):
ADDRESS
id (PK)
user_id (FK)
street
USERS
users_id(FK)
name_of_user
OTHER
users_id (PK)
这些是我的java文件:
@Entity
@Table(name="ADDRESS")
public class Address {
@Id
@Column(name="ADDRESS_ID")
private long id;
@OneToMany(mappedBy="address", fetch=FetchType.EAGER, cascade=CascadeType.MERGE)
private List<Users> users;
}
第二个:
@Entity
@Table(name = "USERS")
public class Users {
@Id
@Column
private long id;
@ManyToOne(fetch=FetchType.EAGER, cascade=CascadeType.MERGE)
@JoinColumn(name="USERS_ID")
private Address address;
}
我想做什么?我想获取与某个地址相关的所有用户(一个地址可以有很多用户)。问题是Users实体仅对users_id没有引用address_id。我怎么能告诉它应该使用users_id(来自地址表)作为参考键,而不是id?
非常感谢您的帮助。
PS:我删除了getter / setters等。表当然包含更多信息,但这里没有关系。 PPS:我无法改变这些表中的任何内容。 PPPS:我降低了这个系统背后逻辑的复杂性,因为它太大了,不能在这里解释它。所以,请不要考虑:它是否合乎逻辑且设计合理?在这两种情况下,我只是尽可能简单。
祝你好运, MicNeo
答案 0 :(得分:2)
你的桌子有问题。地址表看起来与用户的多对一关系,因为每个地址都引用一个用户。这意味着用户与地址处于一对多关系,与您想要的相反。您应该反转关系或使其成为多对多关系,为此您需要第三个表来将一个用户映射到一个地址。最后,您的实体应该被称为User
,而不是Users
。它代表一个用户,而不是很多。
答案 1 :(得分:1)
映射不正确。 如果您希望该地址包含许多用户,则表格应如下所示。
ADDRESS
id
address
USERS
id
name_of_user
adess_id
你的映射应该如此。 不要忘记您需要实例化用户列表。
@Entity
@Table (name = "USERS")
public class User {
@Id
@Column
private long id;
@ManyToOne (fetch = FetchType.EAGER, cascade = CascadeType.MERGE)
@JoinColumn (name = "ADRESS_ID")
private Address address;
}
@Entity
@Table (name = "ADDRESS")
public class Address {
@Id
@Column (name = "address_id")
private long id;
@OneToMany (mappedBy = "address", fetch = FetchType.EAGER, cascade = CascadeType.MERGE)
private List <User> users;
public Address(){
users = new ArrayList<User>();
}
}