【问题标题】:Hibernate ManyToOne, duplicate key in join table休眠ManyToOne,连接表中的重复键
【发布时间】:2015-09-28 12:25:43
【问题描述】:

我的数据库中有三张表,一张用于房屋,一张用于用户。 在这种情况下,用户可以拥有很多房子。

每个 House 都有一个唯一的生成 Id(PK)。用户的用户名是 Id(PK)。并且用户在他们的类中有一个包含房屋对象的集合。

假设用户 foo 添加了 3 个拥有钥匙的 houes; 1, 2, 3 然后用户栏继续使用密钥 1 添加房子,然后我得到休眠错误,说我有重复的密钥。

sep. 28, 2015 2:06:00 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
ERROR: Duplicate entry '1' for key 'UK_r5dofs84kmj9k4a73t03avcce'
sep. 28, 2015 2:06:00 PM org.hibernate.engine.jdbc.batch.internal.AbstractBatchImpl release
INFO: HHH000010: On release of batch it still contained JDBC statements

我在环顾多对多,以及一些人是如何做到这一点的。但请注意,我的家庭课程也会有一个用户收藏。这在我的代码中根本没有任何功能。

下面是我的两节课。

用户类

@Entity
public class User {

@Id
private String username;
private String firstname;
private String lastname;

@OneToMany(fetch=FetchType.EAGER)
private Collection<Houses> houses = new ArrayList<>();

public User() {
}

public User(String username) {
    this.username = username;
}

public Collection<Houses> getHouses() {
    return houses;
}

public void setHouses(Collection<Marker> houses) {
    this.houses = houses;
}

public String getUsername() {
    return username;
}

public void setUsername(String username) {
    this.username = username;
}

public String getFirstname() {
    return firstname;
}

public void setFirstname(String firstname) {
    this.firstname = firstname;
}

public String getLastname() {
    return lastname;
}

public void setLastname(String lastname) {
    this.lastname = lastname;
}
}

家居类

@Entity
@Table(name="house")
public class House{


    private String address; 

    @Id  @GeneratedValue(strategy=GenerationType.AUTO)
    private long projectId; 

    public House() {

    }

    public House(String address) {
        this.address = address;
    }

    public long getProjectId() {
        return projectId;
    }

    public void setProjectId(long projectId) {
        this.projectId = projectId;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

我不知道有什么问题,我错在这是一个 OneToMany 关系吗?

【问题讨论】:

  • 如果每个用户可以拥有多个房屋并且每个房屋可以拥有多个用户(居民)是多对多。

标签: java hibernate


【解决方案1】:

您的 ManyToMany 想法是正确的方法,因为您的情况是,一所房子可以属于多个用户,而一个用户可以拥有许多房子。所以我会创建类似的东西: User.java

//...
@ManyToMany
@JoinTable(name = "house_user_association", joinColumns = {
        @JoinColumn(name = "username", referencedColumnName = "username")},
        inverseJoinColumns = {@JoinColumn(name = "house_id", referencedColumnName = "projectId")})
private Set<House> houses = new HashSet<>();
//...

House.java

//...
@ManyToMany(mappedBy = "houses")
private Set<User> users = new HashSet<>();
//...

一切都应该运行良好。

它将创建一个连接表来映射您的实体星座。

编辑 对于您需要的独特的多对多 User.java

//...
@ManyToMany
@JoinTable(name = "house_user_association", joinColumns = {
        @JoinColumn(name = "username", referencedColumnName = "username")},
        inverseJoinColumns = {@JoinColumn(name = "house_id", referencedColumnName = "projectId"),
        uniqueConstraints = { @UniqueConstraint(columnNames = { "username", "house_id"})
private Set<House> houses = new HashSet<>();
//...

【讨论】:

  • 问题解决了。然而,一个新的出现了,我可以在我的数据库中看到,通过添加它,它有时会加倍它。因此表“house_user_association”有两行相同。我可以使行唯一吗?
  • 为了唯一性,我编辑了我的帖子,但是如果你使用集合而不是列表,那么重复应该没有问题......
  • 我尝试让它适用于 Set,因为我的其他代码依赖于此。但我会改变它。非常感谢您的帮助:)
猜你喜欢
  • 2018-06-12
  • 1970-01-01
  • 2016-09-07
  • 1970-01-01
  • 2018-07-30
  • 2021-02-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多