gpt4 book ai didi

java - 如何使用 hibernate 使用现有对象创建复合键对象

转载 作者:行者123 更新时间:2023-12-01 19:58:57 26 4
gpt4 key购买 nike

假设我有以下数据库架构

CREATE TABLE employee(
id BIGINT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
hrid VARCHAR (50)
);
CREATE TABLE territory(
id BIGINT PRIMARY KEY,
name varchar (50)
);
CREATE TABLE transcode(
id BIGINT AUTO_INCREMENT PRIMARY KEY,
code VARCHAR (10) NOT NULL
);
create table employee_territory_function(
employee_id BIGINT NOT NULL,
territory_id BIGINT NOT NULL,
transcode_id BIGINT NOT NULL,
PRIMARY KEY (employee_id,territory_id),
CONSTRAINT employeeref FOREIGN KEY (employee_id) REFERENCES employee (id),
CONSTRAINT territoryref FOREIGN KEY (territory_id) REFERENCES territory (id) ,
CONSTRAINT transcoderef FOREIGN KEY (transcode_id) REFERENCES transcode (id)
);

现在我有以下 JPA 映射实体

员工实体

@Entity
public class Employee implements Serializable {
private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private String name;
private String hrid;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "employee", cascade = CascadeType.ALL)
private Set<EmployeeTerritoryFunction> employeeTerritoryFunctionList = new HashSet<>();
//getters and setters
}

领土实体:

@Entity
public class Territory implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private String name;

// getters and setters for all field

}

转码实体:

@Entity
public class Territory implements Serializable {
@Id
private long id;
private String name;
//getters and setters
}

EmployeeTerritoryFunction 实体(复合键表)

@Entity
@IdClass(value = EmployeeTerritoryFunctionPK.class)
public class EmployeeTerritoryFunction implements Serializable {
private static final long serialVersionUID = 1L;

@Id
@ManyToOne
private Employee employee;

@Id
@ManyToOne
private Territory territory;

@ManyToOne
@JoinColumn(name = "transcode_id", referencedColumnName = "id")
private Transcode transcode;
//getters and setters
}

EmployeeTerritoryFunction pk

public class EmployeeTerritoryFunctionPK implements Serializable {
private static final long serialVersionUID = 1L;

private Long employee;
private Long territory;
//getters and setters, no args constructor, equals and hashcode
}

下面的示例插入

Employee employee = this.employeeRepository.findByHrid("111");
if (employee == null) {
employee = new Employee();
employee.setName("Marie");
employee.setHrid("333");
}

Territory territory = new Territory();
territory.setId(2L);
territory.setName("T2");

Territory territory2 = new Territory();
territory2.setId(3L);
territory2.setName("T3");


Transcode transcode = this.transcodeRepository.findByCode("ASC");
Transcode transcode2 = this.transcodeRepository.findByCode("CC");


EmployeeTerritoryFunction employeeTerritoryFunction1 = new EmployeeTerritoryFunction();

employeeTerritoryFunction1.setTranscode(transcode);
employeeTerritoryFunction1.setTerritory(territory);
employeeTerritoryFunction1.setEmployee(employee);
employee.getEmployeeTerritoryFunctionList().add(employeeTerritoryFunction1);

EmployeeTerritoryFunction employeeTerritoryFunction2 = new EmployeeTerritoryFunction();
employeeTerritoryFunction2.setTranscode(transcode2);
employeeTerritoryFunction2.setTerritory(territory2);
employeeTerritoryFunction2.setEmployee(employee);
employee.getEmployeeTerritoryFunctionList().add(employeeTerritoryFunction2);

employeeRepository.save(employee);

当我仅使用新对象运行上面的代码时,我没有问题,因为 hibernate 会自动插入员工、地区和employee_territory_function列表,但是当我第一次删除所有现有地区、employee_territory_function并尝试使用现有员工插入时, hibernate 无法自动插入或更新员工、自动插入区域、employee_territory_function。错误如下

Caused by: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.example.demo.Employee.employeeTerritoryFunctionList, could not initialize proxy - no Session

当我将 oneToMany 获取类型替换为 EAGER 时,出现以下错误

Caused by: javax.persistence.EntityNotFoundException: Unable to find com.example.demo.Territory with id 3

似乎 hibernate 尝试查询 Territory 表,但我没有当他这样做,因为我删除了 Territory 和 EmployeeTerritoryFunction 表上的所有数据,并且只有员工现有数据未被删除。

请问如何解决?

最佳答案

EmployeeTerritoryFunction 和 EmployeeTerritoryFunctionPK 类中的字段应命名完全相同,并且具有您没有的相同类型。尝试这样:

@Entity
@IdClass(EmployeeTerritoryFunctionPK.class)
public class EmployeeTerritoryFunction implements Serializable {

@Id
@ManyToOne
private Employee employee;

@Id
@ManyToOne
private Territory territory;
}

public class EmployeeTerritoryFunctionPK implements Serializable {
private Employee employee;
private Territory territory;

public int hashCode() { //TODO }
public boolean equals(Object obj) { //TODO }

}

关于java - 如何使用 hibernate 使用现有对象创建复合键对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59017366/

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