gpt4 book ai didi

java - 如何使用带有 JBOSS 工具的 Hibernate 在数据库中添加新记录?

转载 作者:行者123 更新时间:2023-11-30 23:50:57 25 4
gpt4 key购买 nike

我正在使用 Eclipse 和 JBOSS 工具从 MySQL 生成 hibernate 类。salary表有复合键,一个是FK(userId),一个是AUTO_INCREMENT。于是JBOSS Tool生成了Salary和User类,同时也生成了SalaryId类。我在 User 类的 getSalaries 方法中添加了级联,但是当我尝试保存新用户时,我总是得到异常:org.hibernate.exception.ConstraintViolationException:无法添加或更新子行:外键约束失败

有没有人能帮我解决这个问题?谢谢大家~

下面是我的表结构:

CREATE TABLE IF NOT EXISTS `salary` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`userId` int(11) NOT NULL,
`amount` int(11) NOT NULL,
`comingDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`,`userId`),
KEY `userId` (`userId`)
)

下面是我生成的类:[用户类]

@Entity
@Table(name = "user", catalog = "lab")
public class User implements java.io.Serializable {

private Integer id;
private String name;
private String password;
private String email;
private Set<Salary> salaries = new HashSet<Salary>(0);

public User() {
}

public User(String name, String password, String email, Set<Salary> salaries) {
this.name = name;
this.password = password;
this.email = email;
this.salaries = salaries;
}

@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "id", unique = true, nullable = false)
public Integer getId() {
return this.id;
}
public void setId(Integer id) {
this.id = id;
}

@Column(name = "name", nullable = false, length = 100)
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}

@Column(name = "password", nullable = false, length = 100)
public String getPassword() {
return this.password;
}
public void setPassword(String password) {
this.password = password;
}

@Column(name = "email", nullable = false, length = 50)
public String getEmail() {
return this.email;
}
public void setEmail(String email) {
this.email = email;
}

@OneToMany(fetch = FetchType.LAZY, mappedBy = "user", cascade = CascadeType.ALL)
public Set<Salary> getSalaries() {
return this.salaries;
}
public void setSalaries(Set<Salary> salaries) {
this.salaries = salaries;
}
}

[薪资等级]

@Entity
@Table(name = "salary", catalog = "lab")
public class Salary implements java.io.Serializable {

private SalaryId id;
private User user;
private int amount;
private Date comingDate;

public Salary() {
}

public Salary(SalaryId id, User user, int amount) {
this.id = id;
this.user = user;
this.amount = amount;
}

public Salary(SalaryId id, User user, int amount, Date comingDate) {
this.id = id;
this.user = user;
this.amount = amount;
this.comingDate = comingDate;
}

@EmbeddedId
@AttributeOverrides({
@AttributeOverride(name = "id", column = @Column(name = "id", nullable = false)),
@AttributeOverride(name = "userId", column = @Column(name = "userId", nullable = false)) })
public SalaryId getId() {
return this.id;
}

public void setId(SalaryId id) {
this.id = id;
}

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "userId", nullable = false, insertable = false, updatable = false)
public User getUser() {
return this.user;
}

public void setUser(User user) {
this.user = user;
}

@Column(name = "amount", nullable = false)
public int getAmount() {
return this.amount;
}

public void setAmount(int amount) {
this.amount = amount;
}

@Temporal(TemporalType.TIMESTAMP)
@Column(name = "comingDate", nullable = false, length = 19)
public Date getComingDate() {
return this.comingDate;
}

public void setComingDate(Date comingDate) {
this.comingDate = comingDate;
}
}

下面是JBOSS工具自动生成的:

[SalaryId 类]

@Embeddable
public class SalaryId implements java.io.Serializable {

private int id;
private int userId;

public SalaryId() {
}

public SalaryId(int id, int userId) {
this.id = id;
this.userId = userId;
}

@Column(name = "id", nullable = false)
public int getId() {
return this.id;
}

public void setId(int id) {
this.id = id;
}

@Column(name = "userId", nullable = false)
public int getUserId() {
return this.userId;
}

public void setUserId(int userId) {
this.userId = userId;
}

public boolean equals(Object other) {
if ((this == other))
return true;
if ((other == null))
return false;
if (!(other instanceof SalaryId))
return false;
SalaryId castOther = (SalaryId) other;

return (this.getId() == castOther.getId())
&& (this.getUserId() == castOther.getUserId());
}

public int hashCode() {
int result = 17;

result = 37 * result + this.getId();
result = 37 * result + this.getUserId();
return result;
}
}

[主类]

transaction = session.beginTransaction();
SalaryId salaryId = new SalaryId();
Set<Salary> salaries = new HashSet<Salary>();

User user = new User();
user.setName("JW");
user.setPassword("123456");
user.setEmail("jjj@jj.cc");

salaries.add(new Salary(salaryId, user, 10000));
user.setSalaries(salaries);

session.save(user);

transaction.commit();

最佳答案

尝试这样做:

transaction = session.beginTransaction();
SalaryId salaryId = new SalaryId();
Set<Salary> salaries = new HashSet<Salary>();

User user = new User();
user.setName("JW");
user.setPassword("123456");
user.setEmail("jjj@jj.cc");

session.save(user);

salaries.add(new Salary(salaryId, user, 10000));
//user.setSalaries(salaries);

transaction.commit();

关于java - 如何使用带有 JBOSS 工具的 Hibernate 在数据库中添加新记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11392404/

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