@OneToMany和不同的主键

时间:2014-01-29 16:15:11

标签: java jpa primary-key one-to-many many-to-one

我的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

2 个答案:

答案 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>();
    }

}