gpt4 book ai didi

java - Hibernate ManyToOne,连接表中的重复键

转载 作者:行者123 更新时间:2023-12-02 04:20:30 25 4
gpt4 key购买 nike

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

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

假设用户 foo 添加了 3 个拥有 key 的 houes; 1、2、3,然后用户栏继续添加带有 key 1 的房子,然后出现 hibernate 错误,提示我有重复的 key 。

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

我正在研究ManyToMany,以及一些人是如何做到这一点的。但注意到我的家庭类也有一个与用户的集合。这在我的代码中根本没有任何功能。

下面是我的两个类(class)。

用户类别

@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 关系,我错了吗?

最佳答案

您的多对多想法是正确的方法,因为您遇到的情况是一栋房子可以属于多个用户,而一个用户可以拥有多栋房子。所以我会创建类似的东西: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<>();
//...

关于java - Hibernate ManyToOne,连接表中的重复键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32822953/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com